迭代器在分配给 Python 中的切片之前是否被消耗? “在分配之前消耗”是指在切片分配发生之前,所有元素都同时在内存中创建(放入列表或元组中)。 另一种方法是将迭代器中的元素一个一个地放入切片中,因此不会同时在内存中创建元素。
例如,让我们考虑这段代码:
from itertools import islice
from heapq import merge
c = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5] + list(range(10))
lo, mid, hi = 0, 10, 20
c[lo:hi] = merge(islice(iter(c), lo, mid), islice(iter(c), mid, hi))
merge 返回一个迭代器,该迭代器从给定的两个迭代器中选取最小的元素进行合并。这些迭代器会在切片分配发生之前被消耗吗?
最佳答案
这取决于切片分配到的序列的实现。序列直接接收迭代器,消费迭代器的细节由序列决定。
对于列表,当前的 CPython 实现 consumes the iterator up front在对列表进行任何修改之前:
v_as_SF = PySequence_Fast(v, "can only assign an iterable");
PySequence_Fast
将从任何还不是列表或元组的参数构建一个列表。
还有自赋值处理,因为当您将列表切片赋值给自身时,将输入转换为列表不足以确保安全:
/* Special case "a[i:j] = a" -- copy b first */
v = list_slice(b, 0, Py_SIZE(b));
我认为没有记录任何此列表行为。
关于python - 将迭代器分配给 Python 切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53286531/