Python 列表切片是否会创建对象的副本?

Susan Sarandon
发布: 2024-11-06 07:01:03
原创
952 人浏览过

 Does Python List Slicing Create Copies of Objects?

Python 中的列表切片:维护对象完整性

虽然假设 Python 中的列表切片会创建对象的副本似乎是合乎逻辑的包含的对象,实际情况并非如此。相反,切片只是生成引用相同底层对象的新列表。这种识别对于理解 Python 的列表切片机制起着至关重要的作用。

行动中的不变性

考虑一个整数列表:

[1000 + 1, 1000 + 1, 1000 + 1]
登录后复制

尽管具有相同的值,这些对象是具有唯一 ID 的不同实体,如下所示:

map(id, [1000 + 1, 1000 + 1, 1000 + 1])
登录后复制

切片此列表可以保持这些引用的完整性:

b = [1000 + 1, 1000 + 1, 1000 + 1][1:3]
map(id, b)
登录后复制

两个映射操作的输出是相同的,确认切片不会生成整数的新副本。

可变对象的行为类似

观察到类似的行为对于字典或列表等可变对象:

a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']]
map(id, a[1:])
登录后复制

切片仍然保留原始引用,表明切片是一种非复制操作。

复制的开销

复制的开销
for i in range(len(a)):
    x = a[:i]
    print('len: {}'.format(len(x)))
    print('size: {}'.format(sys.getsizeof(x)))
登录后复制
虽然切片不涉及复制对象本身,但它会复制引用。在 64 位机器上每个引用占用 8 个字节,每个列表都有额外的 72 个字节的开销:

尽管如此,对于大多数应用程序来说,这种开销通常不是一个重要的问题。

替代方案:视图

虽然 Python 缺乏对视图的直接支持,但可以采用 numpy 数组等替代选项来实现内存优化。切片 numpy 数组创建与原始视图共享内存的视图,减少了开销,但引入了潜在的意外修改。

总之,Python 中的切片保留了对所包含对象的引用,避免了昂贵的复制操作。此机制通过确保切片反映对原始列表所做的更改来简化代码维护。虽然内存开销是一个考虑因素,但对于大多数实际应用程序来说,它通常不是主要问题。

以上是Python 列表切片是否会创建对象的副本?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!