Python 函数不修改传递给它的列表
Python function not modifying the list passed to it
- 为什么函数
x
不修改传递给它的列表的内容?
- 如何更改 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)
请注意,您应该以相反的顺序遍历列表。
- 为什么函数
x
不修改传递给它的列表的内容? - 如何更改 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)
请注意,您应该以相反的顺序遍历列表。