1

当我有一个 for 循环时:

for row in list:
    row = something_or_other

似乎有时我可以直接分配一个值(或附加/扩展等)row并相应地进行list更改,有时我必须做一些迂回的事情,例如:

for row in list:
    list[list.index(row)] = something_or_other

是什么赋予了?!?

4

3 回答 3

7

您永远不能像这样重新分配值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]])。用技术术语来说,这是重新绑定操作和变异操作之间的区别。

于 2012-09-03T15:52:39.433 回答
1

row在 for 循环中只是原始名称(但在 for 中重新分配它 - 有效地破坏了链接)。因此,如果它是可变的,那么您可以在其上使用将反映在底层对象中的方法(例如appendadd等)。extend

正确的成语是使用:

for rowno, row in enumerate(some_list):
    some_list[rowno] = #...
于 2012-09-03T15:55:37.403 回答
1

分配 to会lst[lst.index(row)]导致O(n²)performance 而不是O(n),如果列表包含多个相同的项目,则可能会导致错误。

相反,分配一个新列表,用列表推导式构造或map

lst = [1,2,3,4]
doubled = [n*2 for n in lst]

或者,如果您真的想修改原始列表,可以使用enumerate :

for i,n in enumerate(lst):
    lst[i] = n*2
于 2012-09-03T15:52:13.047 回答