2012-09-03 67 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] = #...