2017-04-20 57 views
-2

看看下面樣品:用於循環調用__iter__嗎?

a = [1, 2, 3, 4] 

for i in a: 
    print(a) 

'a' 爲列表(可迭代)而不是迭代器。

我不是要求知道iter或iter()將列表轉換爲迭代器!

我想知道如果循環本身隱式轉換列表,然後調用iter迭代保持列表不刪除像迭代器?

由於計算器確定我的問題是可能重複: 的潮頭部分,我不是詢問有關循環的概念,也不ITER,我問的for循環,並與ITER關係的核心機制。

感謝

+3

我不知道我的理解「一世' m要求知道循環本身是否隱式轉換列表,然後調用它作爲迭代保持列表而不刪除像迭代器?「你什麼意思? – MSeifert

+0

我不遵循你的問題,你想知道for循環如何迭代列表? – LethalProgrammer

+0

@LethalProgrammer是的。如果與__iter__有任何關係的話。 – anati

回答

4

我打聽才知道如果循環本身轉換列表中隱含然後調用ITER迭代保存列表而不刪除像迭代器?

for循環不會隱式轉換列表,它變異列表中的意義,但它隱含創建一個從列表中的迭代器。列表本身在迭代期間不會改變狀態,但是創建的迭代器會。

a = [1, 2, 3] 
for x in a: 
    print(x) 

相當於

a = [1, 2, 3] 
it = iter(a) # calls a.__iter__ 
while True: 
    try: 
     x = next(it) 
    except StopIteration: 
     break 
    print(x) 

這裏的證明,__iter__實際上被調用:

import random 

class DemoIterable(object): 
    def __iter__(self): 
     print('__iter__ called') 
     return DemoIterator() 

class DemoIterator(object): 
    def __iter__(self): 
     return self 

    def __next__(self): 
     print('__next__ called') 
     r = random.randint(1, 10) 
     if r == 5: 
      print('raising StopIteration') 
      raise StopIteration 
     return r 

迭代在DemoIterable

>>> di = DemoIterable() 
>>> for x in di: 
...  print(x) 
... 
__iter__ called 
__next__ called 
9 
__next__ called 
8 
__next__ called 
10 
__next__ called 
3 
__next__ called 
10 
__next__ called 
raising StopIteration