Python修改函数内的列表

时间:2014-12-03 05:45:53

标签: python list function

我试图让一个函数通过传递列表的引用来修改列表。下面的程序显示当我将列表传递给函数时,只生成一个局部变量。有没有办法在函数中从该列表中选择一些成员?谢谢。

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]

Edit1:我也尝试使用以下功能。它也不起作用。也许它是因为在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]

5 个答案:

答案 0 :(得分:2)

您必须返回并将返回的值分配给list1

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

list1=func(list1)

或者您必须在list1内引用global作为func()

答案 1 :(得分:1)

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)
....

答案 2 :(得分:1)

您已经遇到过"通过名字"。您显示的代码只会改变" list1"名称​​是func()指向的本地名称。如果您使用" list1" name来改变所引用内容的值,而不是指向" list1"将func()中的名称命名为其他内容,然后程序的其余部分将会看到它。

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

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

答案 3 :(得分:1)

选项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]

答案 4 :(得分:1)

请转到http://www.pythontutor.com/visualize.html以查看您的代码。它会给你一个更准确的解释。

以下是一个简短的解释和两个可能的解决方案:

list1 = list1[2:]

此行创建一个新列表并将其分配给func命名空间中的本地变量list1 ,同时保持全局列表静止。 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]
    
  3. 希望它有所帮助。