我打聽才知道如果循環本身轉換列表中隱含然後調用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
我不知道我的理解「一世' m要求知道循環本身是否隱式轉換列表,然後調用它作爲迭代保持列表而不刪除像迭代器?「你什麼意思? – MSeifert
我不遵循你的問題,你想知道for循環如何迭代列表? – LethalProgrammer
@LethalProgrammer是的。如果與__iter__有任何關係的話。 – anati