Что именно отображает id ()? - PullRequest
0 голосов
/ 04 июля 2018

Функция id () появляется для определения значения, а не объекта. Какая из сущностей ниже на самом деле является объектом: x? 11? 12?

Идентификатор (объект) Вернуть «личность» объекта. Это целое число (или длинное целое), которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимися временами жизни могут иметь одинаковое значение id ().

$ python
Python 2.7.5 (default, May  3 2017, 07:55:04)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-14)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(11)
11311992
>>> x=11
>>> id(x)
11311992
>>> id(12)
11311968
>>> x=12
>>> id(x)
11311968

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

id действительно однозначно идентифицирует живые объекты (как в: если id(a) == id(b), то a is b == True и если id(a) != id(b), a is b == False). Поведение, которое вы видите (несвязанные «экземпляры» 11 на самом деле являются одним и тем же объектом) происходит из деталей реализации CPython.

В CPython литерал 11 всегда будет возвращать один и тот же объект, поскольку есть встроенный кэш для чисел от -5 до 256 . Попробуйте свой код с 257, и вы увидите, что каждый раз вы будете получать разные id s - если вы не напишите их в одном выражении, поскольку в этом случае есть оптимизация, которая предоставит вам один и тот же объект.

Тем не менее, это показывает, что исследование идентичности неизменяемых объектов в значительной степени бессмысленно - два неизменных объекта с одним и тем же значением могут на самом деле или не могут быть одним и тем же объектом, в зависимости от кэшей / оптимизаций, и вам просто не следует заботиться об этом. ваш код. Для неизменных объектов все, что вам нужно, это их ценность.

0 голосов
/ 04 июля 2018

id() возвращает идентификатор объекта, но, похоже, вы используете слово «значение» для описания того, что Python называет объектом. В Python «объект» имеет особое значение - все является объектом. (Другими словами, для любого x, isinstance(x, object) верно.)

например. 11 и 12 оба являются объектами:

>>> isinstance(11, object)
True

Для более подробной информации, вы можете захотеть увидеть этот ответ (или это может просто сбить с толку - это, безусловно, смущает меня!)

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