2017-05-25 409 views
0

去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 
+1

無論您是否在迭代期間重新分配循環,循環都會繼續。它不會回到開始...... – Li357

+0

爲什麼你會期望在它已經啓動循環後對變量'a'進行更改以對循環產生任何影響? – AChampion

+0

@AndrewLi是的,你是對的,那是它正在顯示的行爲,但我除了有關這個的詳細解釋。 – Arun

回答

3

粗略地說,循環並不是無限的,因爲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任何更改都不會影響,因爲ii已經綁定到一個迭代循環在第一[ 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

+0

我覺得這個答案是確實的盡力解釋正在發生的事情,但我認爲有一些事情比他們需要的更混亂。首先,我不會混淆for循環中的'i'值和生成它的迭代器。爲迭代器使用不同的名稱,比如'it'。我也會用'iter'內建生成迭代器,而不是直接在列表中調用'__iter__'方法。我還建議使用'next(it)'而不是'it.next()'。內建'next'函數對於向前兼容性要好得多,因爲Python 3會要求'.__ next__()'。 – Blckknght

+0

這也可以通過在'for'循環之前打印'id(a)'並在'for'循環之後打印'id(a)'來驗證。內存地址將會不同。同樣在每次迭代中,for循環中的a'地址可能不同。 – DineshKumar

0

我不知道,爲什麼你需要這個,但這可能幫助你

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看到你的代碼會發生什麼。

+0

更改您要迭代的對象的錯誤主意:https://docs.python.org/3/reference/compound_stmts.html#for – AChampion

+1

我推薦'a .append(i)',它給無限帶來了一些模式:) –

+0

@AChampion,我知道這是不好的。其實它是毫無意義的,甚至不是壞 - )) – marmeladze

1

由於a未被修改(您只是將其設置爲相同的值),因此for循環會按預期進行。當您重新分配a時,您期望的是for循環重新啓動,但這種情況不會發生。

相反,使之無限,嘗試:

a = [1,2,3,4,5,6,7,8,9] 
for i in a: 
    print i 
    a.append(i) 
0

你甚至可以不僅修改名單,但事件的變量的值的內容和你有同樣的結果。

a = [1,2,3,4,5,6,7,8,9] 
for i in a: 
    print i 
    a = "Hello World!" 

for中加載了值,因此不會考慮循環中的任何修改。