既然您要求澄清,我会多说一点;但实际上Ignacio 的答案总结得很好:您只能迭代生成器一次。您的示例中的代码尝试对其进行三次迭代,a 中的每个值一次。
要明白我的意思,请考虑这个简单的例子:
>>> def mygen(x):
... i = 0
... while i < x:
... yield i
... i += 1
...
>>> mg = mygen(4)
>>> list(mg)
[0, 1, 2, 3]
>>> list(mg)
[]
当mygen 被调用时,它会创建一个可以只迭代一次的对象。当您尝试再次对其进行迭代时,您会得到一个空的可迭代对象。
这意味着你必须重新调用mygen,每次你想迭代它`。所以换句话说(使用相当冗长的风格)......
>>> def make_n_lists(gen, gen_args, n):
... list_of_lists = []
... for _ in range(n):
... list_of_lists.append(list(gen(*gen_args)))
... return list_of_lists
...
>>> make_n_lists(mygen, (3,), 3)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
如果您想将参数绑定到生成器并将其作为无参数函数传递,您可以这样做(使用更简洁的样式):
>>> def make_n_lists(gen_func, n):
... return [list(gen_func()) for _ in range(n)]
...
>>> make_n_lists(lambda: mygen(3), 3)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
lambda 只是定义了一个匿名函数;以上与此相同:
>>> def call_mygen_with_3():
... return mygen(3)
...
>>> make_n_lists(call_mygen_with_3, 3)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]