如果我在Python终端中像下面那样分割一个范围,则会返回另一个具有相同范围的表示形式。与列表一样,切片范围会分配额外的空间吗?
>>> range(1,5)[::-1]
range(4, 0, -1)
换句话说,这会创建一个新范围吗?
与常规列表或元组相比,范围类型的优势在于,范围对象将始终占用相同(少量)的内存,无论其表示的范围大小如何(因为它仅存储开始,停止和步进值,根据需要计算各个项目和子范围。]
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,5][::-1]))
48
48
120
120
96
104
没有从第一个范围进行复制(因此,如果对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