2012-09-03 44 views
1

的元件当我有一个for循环:分配值,以列表

for row in list: 
    row = something_or_other 

似乎有时我可以直接分配一个值(或附加/扩展等)row并且因此list变化,并有时候我必须做一些类似迂回的事情:

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

什么给???

回答

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

指定为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 
1

在for循环row仅仅是一个名称的原始(但重新分配给它的里面的 - 有效地打破的链接)。所以如果它是可变的,那么你可以使用它的方法(如append,add,extend等),这将反映在基础对象。

正确的成语是使用:

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