Generator表达式使二进制字符串生成器永远冻结

时间:2016-08-24 22:39:31

标签: python python-3.x generator generator-expression

我编写了一个函数,用于从给定列表s开始生成二进制字符串(所有二进制字符串以s项之一结尾):

def binary_strings(s):
    yield from s
    while True:
        s = [b + x for x in s for b in "01"]
        yield from s

它可以从输出中看到:

>>> for i in binary_strings(["10", "01"]): print(i)

10
01
010
110
001
101
0010
1010
0110
1110
0001
1001
0101
1101
00010
10010
01010
11010
00110
10110
01110
11110
00001
10001
01001
11001
00101
10101
01101
11101
000010
100010
... # Output is infinite so I must truncate it.

现在我修改s并为其使用生成器表达式而不是列表:

def binary_strings(s):
    yield from s
    while True:
        s = (b + x for x in s for b in "01")
        yield from s

现在,在耗尽了三种可能性后,执行突然停止:

>>> for i in binary_strings(["10","01"]): print(i)

10
01
010
110
001
101
# Output is not truncated, the function freezes at this points 
# and yield no more output

我希望第二个版本和第一个版本一样好用,因为我从不在s上使用列表方法而只是遍历它,为什么第二个版本没有工作?

1 个答案:

答案 0 :(得分:1)

我找到了答案,第yield from s行正在耗尽生成器,因此行yield from s从空生成器中产生(在s生成为空之前的理解是空的)因此永远冻结

列表可以多次迭代迭代,因此不会出现此问题。

问题仅在迭代后出现,因为在开始时s是一个列表并且之后成为生成器。