当我有一个 for 循环时:
for row in list:
row = something_or_other
似乎有时我可以直接分配一个值(或附加/扩展等)row
并相应地进行list
更改,有时我必须做一些迂回的事情,例如:
for row in list:
list[list.index(row)] = something_or_other
是什么赋予了?!?
当我有一个 for 循环时:
for row in list:
row = something_or_other
似乎有时我可以直接分配一个值(或附加/扩展等)row
并相应地进行list
更改,有时我必须做一些迂回的事情,例如:
for row in list:
list[list.index(row)] = something_or_other
是什么赋予了?!?
您永远不能像这样重新分配值row
(或者通常,无论您的迭代变量是什么):
x = [1, 2, 3]
for x in lst:
x = # code
因为这是完全重新分配变量x
(它的意思是“忘记它x
是列表的成员”)。
但是,如果x
是可变的,例如如果它是一个列表,你可以这样做:
lst = [[1, 2], [3, 4]]
for x in lst:
x.append(10)
它实际上会改变值(到[[1, 2, 10], [3, 4, 10]]
)。用技术术语来说,这是重新绑定操作和变异操作之间的区别。
row
在 for 循环中只是原始名称(但在 for 中重新分配它 - 有效地破坏了链接)。因此,如果它是可变的,那么您可以在其上使用将反映在底层对象中的方法(例如append
、add
等)。extend
正确的成语是使用:
for rowno, row in enumerate(some_list):
some_list[rowno] = #...
分配 to会lst[lst.index(row)]
导致O(n²)
performance 而不是O(n)
,如果列表包含多个相同的项目,则可能会导致错误。
lst = [1,2,3,4]
doubled = [n*2 for n in lst]
或者,如果您真的想修改原始列表,可以使用enumerate :
for i,n in enumerate(lst):
lst[i] = n*2