的元件当我有一个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]]
)。从技术角度而言,这是rebinding and mutating operations之间的差异。
指定为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
在for循环row
仅仅是一个名称的原始(但重新分配给它的里面的 - 有效地打破的链接)。所以如果它是可变的,那么你可以使用它的方法(如append
,add
,extend
等),这将反映在基础对象。
正确的成语是使用:
for rowno, row in enumerate(some_list):
some_list[rowno] = #...