Использует ли нарезка диапазона дополнительное пространство, как и нарезка списка? - PullRequest
1 голос
/ 29 апреля 2020

Если я нарежу диапазон, как показано ниже, в терминале Python, я вернусь с другим представлением того же диапазона. Как и в случае списков, выделяет ли раздел диапазон дополнительным пространством?

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

Другими словами, создает ли это новый диапазон?

1 Ответ

0 голосов
/ 29 апреля 2020

Преимущество типа диапазона перед обычным списком или кортежем состоит в том, что объект диапазона всегда будет занимать один и тот же (маленький) объем памяти, независимо от размера диапазона, который он представляет (так как он хранит только значения начала, остановки и шага, при необходимости вычисляя отдельные элементы и поддиапазоны).

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
...