它不存储中间 结果 ,但必须存储输入值,因为对于多个输出值,可能需要多次使用每个输入值。
由于您只能在一个迭代器上迭代一次,
product因此不能等效地实现:
def prod(a, b): for x in a: for y in b: yield (x, y)
如果这
b是一个迭代器,则它将在外循环的第一次迭代后耗尽,并且在后续执行中将不再产生任何元素
for y in b。
product通过存储由产生的所有元素来解决此问题
b,以便可以重复使用它们:
def prod(a, b): b_ = tuple(b) # create tuple with all the elements produced by b for x in a: for y in b_: yield (x, y)
实际上,
product即使它的第一个参数可以避免,它也会尝试存储所有给定的可迭代对象所产生的元素。该函数只需要遍历第一个可迭代对象一次,因此不必缓存这些值。但是无论如何它都会尝试做,这导致了
MemoryError您所看到的。



