itertools.product懒惰地生成其结果,但是对于参数而言并非如此。他们受到热切评价。每个可迭代的参数都首先转换为元组:
参数的评估(而不是结果的产生)与文档中显示的Python实现非常相似:
...pools = [tuple(pool) for pool in args] * repeat
而在CPython实现中,
pools是一个元组的元组:
for (i=0; i < nargs ; ++i) { PyObject *item = PyTuple_GET_ITEM(args, i); PyObject *pool = PySequence_Tuple(item); if (pool == NULL) goto error; PyTuple_SET_ITEM(pools, i, pool); indices[i] = 0; }之所以如此,是因为
product有时有时需要遍历一次以上的迭代,如果将参数作为只能被使用一次的迭代器保留,则这是不可能的。
实际上,您不能从
itertools.count对象构建元组。在传递给之前,请考虑 将切片
至的合理长度。
itertools.islice``product



