当我有一个for循环时:
for row in list:
row = something_or_other
有时我似乎可以直接将值(或追加/扩展等)分配给row
并相应地更改list
,有时候我必须做一些环形的事情,如:
for row in list:
list[list.index(row)] = something_or_other
是什么给了什么?!?
答案 0 :(得分: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]]
)。在技术方面,这是rebinding and mutating operations。
答案 1 :(得分:1)
分配到lst[lst.index(row)]
会导致O(n²)
性能而不是O(n)
,如果列表包含多个相同的项目,则可能会导致错误。
而是指定一个新列表,使用list comprehension或map
:
lst = [1,2,3,4]
doubled = [n*2 for n in lst]
或者,如果您真的想要修改原始列表,可以使用enumerate:
for i,n in enumerate(lst):
lst[i] = n*2
答案 2 :(得分:1)
row
只是原始名称(但在for中重新分配 - 有效地破坏了链接)。因此,如果它是可变的,那么您可以在其上使用方法(例如append
,add
,extend
等...),这将反映在基础对象中。
正确的习惯用法是:
for rowno, row in enumerate(some_list):
some_list[rowno] = #...