是为了循环调用__iter __?

时间:2017-04-20 12:16:36

标签: python

请看下面的示例:

a = [1, 2, 3, 4]

for i in a:
    print(a)

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

我不是要求知道 iter 或iter()将列表转换为迭代器!

我想要知道for循环本身是否隐式转换列表然后调用 iter 以获取迭代保持列表而不删除迭代器?

由于stackoverflow将我的问题识别为可能重复: 我不是要求循环作为概念而不是 iter 的uniqe部分,我'询问for循环的核心机制以及与iter的关系。

由于

1 个答案:

答案 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