问题:
给定一个整数列表,生成该整数的所有子列表有效地形成 L[k:] for k in [0, len(L)-1] 而不创建副本。
答案:
在 Python 中切片列表不会生成底层对象的副本,仅对它们的引用。
为了演示这一点,请考虑三个具有相同值的整数对象:
a = [1000 + 1, 1000 + 1, 1000 + 1]
它们有不同的对象 ID,表明它们是单独的对象:
map(id, a) # returns [140502922988976, 140502922988952, 140502922988928]
对这些对象进行切片会产生具有相同引用的新列表对象,表明尚未创建新对象:
b = a[1:3] map(id, b) # returns [140502922988952, 140502922988928]
此行为适用于不可变(例如整数)和可变(例如列表)值。
虽然切片不会生成新对象,但它确实会产生一些内存开销复制引用和维护列表元数据。例如,包含 N 个元素的列表的内存开销为 72 字节。
如果内存优化至关重要,请考虑使用 numpy 数组而不是列表,就像切片 numpy 数组一样在切片和原始数组之间共享内存。然而,这种方法需要小心处理,以避免无意的修改。
Python 中的列表切片是一种高效的操作,不会生成底层对象的副本。在考虑性能优化时应考虑到这种行为。
以上是在 Python 中对列表进行切片是否会创建底层对象的副本?的详细内容。更多信息请关注PHP中文网其他相关文章!