Изменчивые и неизменные объекты в python - PullRequest
1 голос
/ 26 февраля 2020

Мне известно, что в python целые числа от -5 до 256 могут иметь одинаковый идентификатор. Однако каковы последствия в случае, когда два неизменных объекта имеют одинаковый идентификатор? Как насчет последствий, когда два изменяемых объекта имеют одинаковый идентификатор?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 26 февраля 2020

id является определенно уникальным в данный момент времени (только один объект может иметь данный id одновременно). Если вы видите один и тот же id на двух именах одновременно, это означает, что это два имени, относящиеся к одному и тому же объекту. Это не имеет «последствий» для неизменяемых типов, таких как int, потому что невозможно изменить объект с помощью псевдонима (x = y = 5 псевдонимов x и y к одному и тому же объекту 5, но x += 1 примерно эквивалентно x = x + 1 для неизменных объектов, привязка x к новому объекту, 6, без изменения объекта 5 на месте); поэтому оптимизация, такая как небольшой int кэш, который вы наблюдали, безопасна.

0 голосов
/ 26 февраля 2020

Когда два изменяемых объекта имеют одинаковый идентификатор, они ссылаются на один и тот же адрес памяти.

a = 10
b = 10
print(id(a), id(b))

Вывод:

4355009952 4355009952

Единственное последствие того, что два изменяемых объекта с одинаковым идентификатором - это изменение значения в одном объекте, будет отражено в другом.

a = 10
b = a
print(a, b)
print(id(a), id(b))
a = 6
print(a, b)
print(id(a), id(b))

Вывод:

10 10
4338298272 4338298272
6 10
4338298144 4338298272

Неизменяемые неизменные объекты не являются следствием, поскольку они неизменны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...