去infinate爲什麼for循環不是無限的,在這裏循環播放列表上,並重新定義列表內循環for循環不蟒蛇
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a = [1,2,3,4,5,6,7,8,9]
output : 1,2,3,4,5,6,7,8,9
去infinate爲什麼for循環不是無限的,在這裏循環播放列表上,並重新定義列表內循環for循環不蟒蛇
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a = [1,2,3,4,5,6,7,8,9]
output : 1,2,3,4,5,6,7,8,9
粗略地說,循環並不是無限的,因爲i
綁定的迭代器在代碼執行到達for . . . in
循環時被綁定。之後,所有連續的調用都是iter.next()
,這會將現有的迭代器移動到下一個位置,而不管後續重新定義a
。
回想一下,數組具有內置函數__iter__
(或iter
)。然後,你for
循環相當於:
a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(a)
try:
while True:
print next(it) # for compatibility you may want to use next(it)
a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
except StopIteration:
pass
注意,在上面相應的代碼,a
任何更改都不會影響,因爲i
i
已經綁定到一個迭代循環在第一[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
。
您可以通過改變a
第一個值觀察此:
a = [ 1, 2, 3, 4 ]
for i in a:
print i
a = [ 5, 4, 3, 2, 1 ]
注意,a = [ 5, 4, 3, 2, 1 ]
不會在[ 1, 2, 3, 4 ]
的存在,從第一行改變,因爲該數組已經存在於內存中。隨後的調用每個都分配一個新陣列並將其分配給a
。
我覺得這個答案是確實的盡力解釋正在發生的事情,但我認爲有一些事情比他們需要的更混亂。首先,我不會混淆for循環中的'i'值和生成它的迭代器。爲迭代器使用不同的名稱,比如'it'。我也會用'iter'內建生成迭代器,而不是直接在列表中調用'__iter__'方法。我還建議使用'next(it)'而不是'it.next()'。內建'next'函數對於向前兼容性要好得多,因爲Python 3會要求'.__ next__()'。 – Blckknght
這也可以通過在'for'循環之前打印'id(a)'並在'for'循環之後打印'id(a)'來驗證。內存地址將會不同。同樣在每次迭代中,for循環中的a'地址可能不同。 – DineshKumar
我不知道,爲什麼你需要這個,但這可能幫助你
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a.append(10) #or anything else-))
use this tool看到你的代碼會發生什麼。
更改您要迭代的對象的錯誤主意:https://docs.python.org/3/reference/compound_stmts.html#for – AChampion
我推薦'a .append(i)',它給無限帶來了一些模式:) –
@AChampion,我知道這是不好的。其實它是毫無意義的,甚至不是壞 - )) – marmeladze
由於a
未被修改(您只是將其設置爲相同的值),因此for
循環會按預期進行。當您重新分配a
時,您期望的是for
循環重新啓動,但這種情況不會發生。
相反,使之無限,嘗試:
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a.append(i)
你甚至可以不僅修改名單,但事件的變量的值的內容和你有同樣的結果。
a = [1,2,3,4,5,6,7,8,9]
for i in a:
print i
a = "Hello World!"
在for
中加載了值,因此不會考慮循環中的任何修改。
無論您是否在迭代期間重新分配循環,循環都會繼續。它不會回到開始...... – Li357
爲什麼你會期望在它已經啓動循環後對變量'a'進行更改以對循環產生任何影響? – AChampion
@AndrewLi是的,你是對的,那是它正在顯示的行爲,但我除了有關這個的詳細解釋。 – Arun