首页 > 解决方案 > 切片范围是否像切片列表一样使用额外空间?

问题描述

如果我在 Python 终端中像下面这样切片一个范围,我会返回相同范围的另一个表示。与列表一样,对范围进行切片是否会分配额外的空间?

>>> range(1,5)[::-1]
range(4, 0, -1)

换句话说,这会创造一个新的范围吗?

标签: pythonmemoryrangeslicespace

解决方案


范围类型优于常规列表或元组的优点是范围对象将始终占用相同(少量)的内存,无论它表示的范围大小(因为它只存储开始、停止和步长值,根据需要计算单个项目和子范围)。

import sys

print(sys.getsizeof(range(1,5)))

print(sys.getsizeof(range(1,5)[::-1]))

print(sys.getsizeof(list(range(1,5))))

print(sys.getsizeof(list(range(1,5)[::-1])))

print(sys.getsizeof(list(range(1,5))[::-1]))

print(sys.getsizeof([1,2,3,4][::-1]))
48
48
120
120
96
96

没有从第一个范围复制(因此,如果对range(1,5)和应用一次,空间复杂度是相同的range(1,5)[::-1])但是您将获得一个新的范围对象。

range1 = range(1,5)
range2 = range1
range3 = range1[::-1]

print(id(range1))
print(id(range2))
print(id(range3))
140671877466800
140671877466800
140671877466608

推荐阅读