x
不会修改传递给它的列表内容?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]
答案 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)
请注意,您应该按相反的顺序遍历列表。