Понимание уникальности Python id()Python

Программы на Python
Ответить
Anonymous
 Понимание уникальности Python id()

Сообщение Anonymous »

документация Python для id () < /code> Функция указывает следующее: < /p>

Это целое число, которое гарантированно будет уникальным и постоянным для < Br /> Этот объект в течение своей жизни. Два объекта с непересекающимся
могут иметь одинаковый id () < /code> значение. < /P>
< /blockquote>

Подробная информация CPYTHON: это адрес объекта в памяти. Поскольку я явно не Del объекты, я предполагаю, что они все живы и уникальны (я не знаю, что означает непересечение).

Код: Выделить всё

>>> g = [0, 1, 0]
>>> for h in g:
...     print(h, id(h))
...
0 10915712
1 10915744
0 10915712
>>> a=0
>>> b=1
>>> c=0
>>> d=[a, b, c]
>>> for e in d:
...     print(e, id(e))
...
0 10915712
1 10915744
0 10915712
>>> id(a)
10915712
>>> id(b)
10915744
>>> id(c)
10915712
>>>
Как значения id могут быть одинаковыми для разных объектов? Это так, потому что значение 0 (объект класса int) является константой и интерпретатор/компилятор C оптимизирует?
Если бы я сделал = c, то я понимаю, что c имеет тот же идентификатор, что и a, поскольку c будет просто ссылкой на a (псевдоним). В противном случае я ожидал, что объекты a и c будут иметь разные значения id, но, как показано выше, они имеют одинаковые значения.
Что такое происходит? Или я смотрю на это неправильно?
Я ожидаю, что идентификаторы для объектов определяемого пользователем класса будут ВСЕГДА уникальными. даже если у них одинаковые значения членов.
Может ли кто-нибудь объяснить такое поведение? (Я рассмотрел другие вопросы, в которых задается использование id(), но они направлены в другом направлении)
EDIT (30.09.2019):< /strong>
Чтобы расширить то, что я уже написал, я запустил интерпретаторы Python в отдельных терминалах и проверил идентификаторы на 0 на всех из них, они были совершенно одинаковыми (для одного и того же переводчика); несколько экземпляров разных интерпретаторов имели один и тот же идентификатор для 0. Python2 и Python3 имели разные значения, но один и тот же интерпретатор Python2 имел одинаковые значения id.
Мой вопрос заключается в том, что в документации id() этого нет. указать любые подобные оптимизации, что кажется вводящим в заблуждение (я не ожидаю, что будут отмечены все причуды, но было бы неплохо сделать некоторые примечания рядом с примечанием CPython)...
EDIT 2 (30.09.2019):

Вопрос заключается в том, чтобы понять это поведение и узнать, есть ли какие-либо приемы для оптимизации определяемых пользователем классов аналогичным образом (по изменение метода __equals__ для определения того, являются ли два объекта одинаковыми; возможно, они будут указывать на один и тот же адрес в памяти, т.е. на один и тот же идентификатор ИЛИ использовать некоторые свойства метакласса)

Подробнее здесь: https://stackoverflow.com/questions/581 ... uniqueness
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»