В последнее время я ловил id
и понял, что (c?) Python делает что-то весьма разумное: он гарантирует, что маленькие ints всегда имеют одинаковый id
.
>>> a, b, c, d, e = 1, 2, 3, 4, 5
>>> f, g, h, i, j = 1, 2, 3, 4, 5
>>> [id(x) == id(y) for x, y in zip([a, b, c, d, e], [f, g, h, i, j])]
[True, True, True, True, True]
Но потом мне пришло в голову задаться вопросом, верно ли то же самое для результатов математических операций. Оказывается, это:
>>> nines = [(x + y, 9) for x, y in enumerate(reversed(range(10)))]
>>> [id(x) == id(y) for x, y in nines]
[True, True, True, True, True, True, True, True, True, True]
Кажется, что он начинает сбой при n = 257...
>>> a, b = 200 + 56, 256
>>> id(a) == id(b)
True
>>> a, b = 200 + 57, 257
>>> id(a) == id(b)
False
Но иногда он работает даже с большими номерами:
>>> [id(2 * x + y) == id(300 + x) for x, y in enumerate(reversed(range(301)))][:10]
[True, True, True, True, True, True, True, True, True, True]
Что здесь происходит? Как это делает python?