yield 被 zip 调用得太频繁了?

Yield called too often by zip?

在下面的代码中,一个计数被压缩成一个包含两个元素的列表。我预计计数器会被调用两次,但它被调用了三次。为什么?

def equivalent_count(start=0, step=1):
    """From python docs for itertools.count."""
    n = start
    while True:
        print('count in loop =', n)
        yield n
        n += step

c = equivalent_count()
l = [0, 1]

for i, j in zip(c, l):
    pass

输出为:

count in loop = 0
count in loop = 1
count in loop = 2

zip 状态的文档,"The iterator stops when the shortest input iterable is exhausted."

因为c的每次迭代都在l的等效迭代之前计算,所以Python还不知道l已经用完了。如果您也将 l 替换为生成器,您会看到这一点:

def gen_l(lst):
    for l in lst:
        print 'gen_l called'
        yield l

c = equivalent_count()
l = gen_l([0, 1])
for i, j in zip(c, l):
    pass

输出:

count in loop = 0
gen_l called
count in loop = 1
gen_l called
count in loop = 2

交换 cl:

for i, j in zip(l, c):
    pass

只打印两张:

count in loop = 0
count in loop = 1 

现在 l 首先被耗尽并且 next(c) 不会像您的版本那样被调用第三次。