python - 将迭代器分配给 Python 切片

标签 python iterator slice

迭代器在分配给 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/

相关文章:

c++ - directory_iterator - 复制到 "rewind"?

arrays - 从切片构建数组的正确方法?

python - SOCK_STREAM 的作用是什么?

python - 从字典创建饼图并更改箭头

java - 带有迭代器 hasNext() 和 next() 的无限 while 循环

python pandas ... pandas 中 iterrows 的替代方法来获取下一行值(新)

rust - 从 u8 切片创建读取特征对象

python - 在 numpy 数组中围绕已知索引 (x, y) 切片 20×20 区域

python - Windows 10 Linux 子系统 - Python - 字符串到计算机剪贴板

python - python 3.6 subprocess.Popen().returncode of 100 是什么意思?