将值分配给列表的元素

时间:2012-09-03 15:49:36

标签: python

当我有一个for循环时:

for row in list:
    row = something_or_other

有时我似乎可以直接将值(或追加/扩展等)分配给row并相应地更改list,有时候我必须做一些环形的事情,如:

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

是什么给了什么?!?

3 个答案:

答案 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 comprehensionmap

构建
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)

for循环中的

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

正确的习惯用法是:

for rowno, row in enumerate(some_list):
    some_list[rowno] = #...