Python 列表切片是否创建副本或引用?

DDD
发布: 2024-11-08 14:32:02
原创
861 人浏览过

Does Python List Slicing Create Copies or References?

Python 中不进行复制的部分列表切片

Python 的列表切片操作生成对原始列表元素的引用,而不是创建副本。此行为源于这样一个事实:切片保留了列表中元素的对象标识。

演示

为了说明这一点,请考虑以下列表:

<code class="python">L = [1000 + 1, 1000 + 1, 1000 + 1]</code>
登录后复制

尽管这些整数具有相同的值,但它们是不同的对象:

<code class="python">map(id, L)
[140502922988976, 140502922988952, 140502922988928]</code>
登录后复制

对列表进行切片只是复制引用:

<code class="python">b = L[1:3]
map(id, b)
[140502922988952, 140502922988928]</code>
登录后复制

切片的内存开销

虽然切片不会创建对象的副本,它确实涉及复制引用。这些引用会增加与列表相关的总体内存开销:

<code class="python">for i in range(len(L)):
    x = L[:i]
    print('len: {}'.format(len(x)))
    print('size: {}'.format(sys.getsizeof(x)))</code>
登录后复制

此开销可能会累积,特别是在处理大型列表或字典等内存密集型对象时。

替代方案: 视图

Python 缺乏创建视图或列表别名的简单方法。然而,NumPy 数组提供了这种功能。对 NumPy 数组进行切片会创建一个与原始数组共享内存的视图。这可以节省大量内存,但在修改对象时会带来潜在的陷阱。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板