函数内的Python修改列表

问题描述:

我想通过传递列表的引用来让函数修改列表。下面的程序显示了当我将一个列表传递给该函数时,仅生成了一个局部变量。有什么方法可以在函数中从列表中选择一些成员?谢谢。函数内的Python修改列表

def func(list1): 
    list1 = list1[2:]  
    print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1)  # prints [0, 1, 2, 3] 

编辑1:我也试过使用下面的函数。它也不起作用。也许这是因为在func2中,list1变成了引用list2的局部变量。

def func2(list1): 
    list2 = list1[2:]  
    list1 = list2 
    print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1)  # prints [0, 1, 2, 3] 
+0

“选择一些成员”是什么意思? – 2014-12-03 05:46:38

+0

我的意思是,从列表中只选择[2,3] 1 – 2014-12-03 05:48:03

+0

你已经说过了。但是你没有解释这意味着什么。 – 2014-12-03 05:51:35

你必须返回值返回并分配给list1

def func(list1): 
    list1 = list1[2:]  
    print(list1) # prints [2, 3] 
    return list1 

list1=func(list1) 

,或者你必须引用list1作为globalfunc()

list1 = list[2:]将创建一个列表,使局部变量的引用新的列表。它不影响原始列表。

使用列表切片分配得到你想要的东西:

def func(list1): 
    list1[:] = list1[2:] 
    print(list1) # prints [2, 3] 

或使函数返回新的列表,并在主叫方指定的返回值:

def func(list1): 
    return list[2:] 

list1 = [0, 1, 2, 3] 
list1 = func(list1) 
.... 

您已经遇到“通过名称”。您显示的代码只会改变func()指向的本地“list1”名称。如果您使用“list1”名称来更改引用内容的值,而不是将func()中的“list1”名称指向其他内容,那么该程序的其余部分将会看到该名称。

def func(list1): 
    del list1[0:2] 
    # list1 = list1[2:] 
    # print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1) 

选项1:不要这样做。副作用是邪恶的:)

选项2:如果必须,然后应用你的函数作为参数接收对象上破坏性的方法:

def func(list1): 
    list1 = list1[2:] 
    list1.pop(0) 
    list1.pop(0) 
    print(list1) # prints [2, 3] 

list1 = [0, 1, 2, 3] 
func(list1) 
print(list1)  # prints [2, 3] 

请转到http://www.pythontutor.com/visualize.html可视化你的代码。它会给你一个更准确的解释。

这里是一个简短的说明,并为你的问题的两个可能的解决方案:

list1 = list1[2:] 

这行创建了一个新的列表,并将其分配给FUNC命名空间局部变量列表1,而保持全球性依然。 enter image description here

如果你想改变原来的列表:

  1. 请使用替代方法变化(删除,弹出等),用于可发现here名单。

  2. 或者你可以返回这样一个新的列表:

    def func(list1): 
        list1 = list1[2:]  
        print(list1) # prints [2, 3] 
        return list1 
    
    list1 = [0, 1, 2, 3] 
    list1 = func(list1) 
    print(list1)  # prints [2, 3] 
    

希望它能帮助。