繁体   English   中英

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__ ,该参数说“用...替换列表的该分片”,其中...是=的右侧

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM