虽然切片列表可能看起来会创建新副本,但基本事实是不同的。 Python 的切片机制保留对列表元素的引用,而不是复制它们。此行为同时适用于不可变和可变值。
考虑一个包含整数对象的列表:
a = [1000 + 1, 1000 + 1, 1000 + 1]
尽管具有相同的值,但每个整数都是具有唯一 ID 的不同对象:
map(id, a) [140502922988976, 140502922988952, 140502922988928]
对列表进行切片:
b = a[1:3]
显示切片中对象的 ID 是与原始列表中的相同。未创建任何副本。
类似地,字典等可变值的行为方式相同:
a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']] map(id, a) [4380777000, 4380712040] map(id, a[1:] ... ) [4380712040]
而对象引用在切片期间被复制,它们的大小保持不变(64 位机器上为 8 字节)。此外,每个列表都有 72 字节的开销。此开销随着创建的每个切片而增加:
for i in range(len(a)): x = a[:i] print('len: {}'.format(len(x))) print('size: {}'.format(sys.getsizeof(x)))
尽管有开销,与创建全新列表相比,切片列表仍然是一种更有效的方法。
Python 不提供创建列表视图的本机方法。然而,numpy 数组提供了一种通过在切片和原始数组之间共享内存来节省内存的解决方案。对原始数组所做的修改会反映在切片中:
import numpy a = numpy.arange(3) b = a[1:3] a[2] = 1001 b # Output: array([ 1, 1001])
但是,使用视图需要仔细考虑以避免意外修改。
以上是Python 的列表切片会创建副本吗?的详细内容。更多信息请关注PHP中文网其他相关文章!