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

时间:2015-12-06 19:38:05

标签: python list parameter-passing pass-by-reference pass-by-value

  1. 为什么函数x不会修改传递给它的列表内容?
  2. 如何更改MWE以便x 修改传递给它的列表内容?
  3. >>> 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]
    

2 个答案:

答案 0 :(得分:6)

该函数不会修改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那样),这或多或少是运算符[]=

使用切片分配,您使用__setitem__参数调用slice,该参数显示“将此列表替换为...”,其中...是{{1}的右侧}

答案 1 :(得分:1)

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

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

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