的元件當我有一個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] = #...