Python:通过 'list[a:b]' 的迭代是否首先复制列表的那部分(这可能很昂贵)?

标签 python

当我从 startstop 遍历 list1 的值时,如下所示:

for value in list1[start:stop]:
    ....

python 是否首先复制列表的那部分(就像在执行 list2 = list1[:] 时所做的那样)?对于大型列表,这可能会变得非常昂贵!

如果在上面的例子中没有复制它,那是否总是成立?我需要经常在(非常)大列表的大部分上执行以下循环:

for index, value in enumerate(list1[start:stop], start):
    ....

最佳答案

list1[start:stop] 创建一个新列表,period。情况总是如此,无论您是直接迭代结果还是在两者之间有一个函数或在任何其他上下文中使用它(您需要适度的静态语言或复杂的类型推断,以优化即使是简单的第一种情况的实例)。

请注意,这独立于迭代!迭代本身不会复制,即使您丢弃结果,列表切片也会复制。

虽然它只复制指针,所以如果您总是使用非常小的子列表,您可能不会注意到任何差异。如果子列表较大,您可以遍历索引 ([x]range) 或使用 itertools.islice。后者必须首先跳过 start 项目,因此您可能会为节省内存付出大量时间代价。前者很丑陋,但无症状最有效。

关于Python:通过 'list[a:b]' 的迭代是否首先复制列表的那部分(这可能很昂贵)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8590781/

相关文章:

python - 如何将 python datetime(ISO) 截断为小时?

python - 您如何使用另一个包含列表的列表来排序包含列表的列表?

python - 如何使用 keras 计算具有 4 个神经元的输出的类权重?

python - 无法在 fedora 中安装 python-devel 包

python - Pandas pivot_table 保留顺序

python - 你是如何用docker迭代开发的?

python - 在Python中执行与不同软件相关的命令时使用什么语句?

python - 什么是批量收集的聪明方法?

python - 带有 GKE 的 GCS,403 写入 GCS 存储桶的权限不足

python - 基于第一个字符的拆分列表 - Python