请看下面的示例:
a = [1, 2, 3, 4]
for i in a:
print(a)
'a'是列表(可迭代)而不是迭代器。
我不是要求知道 iter 或iter()将列表转换为迭代器!
我想要知道for循环本身是否隐式转换列表然后调用 iter 以获取迭代保持列表而不删除迭代器?
由于stackoverflow将我的问题识别为可能重复: 我不是要求循环作为概念而不是 iter 的uniqe部分,我'询问for循环的核心机制以及与iter的关系。
由于
答案 0 :(得分:4)
我想知道for循环本身是否隐式转换列表然后调用iter for iteration keep list而不删除迭代器?
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