使用生成器的Python嵌套循环不起作用(在某些情况下)?

pha*_*ile 9 python generator nested-loops

请问有人请使用生成器解释嵌套循环的行为吗?这是一个例子.

a = (x for x in range(3))
b = (x for x in range(2))
for i in a:
    for j in b:
        print (i,j)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,在第一次迭代后不评估外部循环.结果是,

(0, 0)
(0, 1)
Run Code Online (Sandbox Code Playgroud)

另一方面,如果将生成器直接插入到循环中,它就能达到我的预期.

for i in (x for x in range(3)):
    for j in (x for x in range(2)):
        print (i,j)
Run Code Online (Sandbox Code Playgroud)

给所有3x2对.

(0, 0)
(0, 1)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
Run Code Online (Sandbox Code Playgroud)

Lau*_*low 24

这是因为在b外部for循环的第一次迭代期间,生成器已耗尽.后续迭代实际上会有一个空的内部循环(如for x in ()),所以内部永远不会被执行.这给人以错误的印象,即外环以某种方式失败.

你的第二个例子是有效的,因为内部生成器是为每个外部循环重新创建的.要修复你的第一个例子,你必须这样做:

a = (x for x in range(3))
for i in a:
    b = (x for x in range(2))
    for j in b:
        print (i,j)
Run Code Online (Sandbox Code Playgroud)


Jon*_*nts 8

@lazyr已经非常出色地回答了这个问题,但是我想指出当使用嵌套生成器时,值得了解itertools.product...

for i, j in itertools.product(range(3), range(2)):
    print (i, j)
Run Code Online (Sandbox Code Playgroud)

或者(如果你有很多 val):

for vals in itertools.product(range(45), range(12), range(3)):
    print (sum(vals))
Run Code Online (Sandbox Code Playgroud)

它(恕我直言)可读并避免过度缩进.