Обратите внимание, что этот вопрос может быть (является ли?) специфичным для CPython.
Скажем, у вас есть какой-то список, и проверьте копии списка на идентичность друг с другом:
>>> a=list(range(10))
>>> b,c=a[:],a[:]
>>> b is c
False
>>> id(b), id(c)
(3157888272304, 3157888272256)
Там нет сильных толчков. Но если мы сделаем это более эфемерным способом, поначалу все может показаться немного странным:
>>> a[:] is a[:]
False # <- two ephemeral copies not the same object (duh)
>>> id(a[:]),id(a[:])
(3157888272544, 3157888272544) # <- but two other ephemerals share the same id..? hmm....
...пока мы не поймем, что, вероятно, здесь происходит. Я не подтвердил это, посмотрев на реализацию CPython (я едва умею читать C++, так что, если честно, это было бы пустой тратой времени), но, по крайней мере, кажется очевидным, что даже если два объекта имеют одинаковый идентификатор, CPython умен. достаточно знать, что это не один и тот же объект.
Предполагая, что это правильно, мой вопрос: какие критерии использует CPython, чтобы определить, являются ли два эфемерных объекта разными объектами, учитывая, что они имеют один и тот же идентификатор (предположительно, из соображений эффективности - см. ниже)? Возможно, он смотрит на время, когда он был отмечен как сборщик мусора? Время создания? Или что-то другое...?
Моя теория о том, почему у них один и тот же идентификатор, заключается в том, что, вероятно, CPython знает, что эфемерная копия списка уже была создана и ожидает сборки мусора, и он просто эффективно повторно использует ту же память. место нахождения. Было бы здорово, если бы ответ мог прояснить/подтвердить и это.
list
, которые вы создаете для передачи вid
, перестают существовать после того, как вы передаете их вid
. Помните, что подсчет ссылок CPython восстанавливает объект, как только счетчик ссылок становится равным нулю. Среда выполнения CPython имеет частно управляемую кучу, которая очень хорошо подходит для повторного использования памяти. Python пошел дальше и повторно использовал ту же память для выделения вашего нового объекта списка, переданного второму вызовуid
. Другими словами, эти два объекта не имеют перекрывающихся жизненных циклов, поэтомуid
не гарантированно уникальны. - person juanpa.arrivillaga   schedule 23.01.2019False
? Он должен проверять ЧТО-ТО кроме идентификатора - person Rick supports Monica   schedule 23.01.2019>>> a[:] is a[:]
- person Rick supports Monica   schedule 23.01.2019is
, они не будут иметь одинаковый идентификатор во время проверки - person juanpa.arrivillaga   schedule 23.01.2019a[:] is a[:]
две стороны НЕ имеют одинаковый идентификатор. - person jasonharper   schedule 23.01.2019is
. Это другой вопрос, потому что другой спрашивал, почему идентификаторы одинаковы; Я спрашивал, почему операцияis
завершается успешно. - person Rick supports Monica   schedule 23.01.2019