Python 函数不修改传递给它的列表

Python function not modifying the list passed to it

  1. 为什么函数 x 不修改传递给它的列表的内容?
  2. 如何更改 MWE,以便 x 修改传递给它的列表的内容?
>>> def x(mylist):
...     mylist = [ x for x in mylist if x > 5 ]
... 
>>> foo = [1,2,3,4,5,6,7,8,9,10]
>>> x(foo)
>>> print foo
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

该函数不会修改 x,因为它正在将名称 mylist 重新分配给一个新值。替代方案会令人惊讶。

a = 1
b = a
b = 2
assert a == 1 # would you want a to be 2 here?

如果要替换内容,可以使用切片赋值来实现

def x(mylist):
    mylist[:] = [ x for x in mylist if x > 5 ]

python 中的赋值运算符不会进入任何方法调用。它是名称重新绑定的机制。但是,您可以实现 __setitem__ 方法(如 list 所做的那样),它或多或少是运算符 []=

通过切片赋值,您使用 slice 参数调用 __setitem__ "replace this slice of the list with ..." 其中 ... 是 =[=20= 的右侧]

正如 Ryan Haining 所解释的那样,x 正在重新分配列表。但是,它应该只修改列表项:

def x(mylist):
    for i in reversed(mylist):
        if not i > 5:
            mylist.remove(i)

请注意,您应该以相反的顺序遍历列表。