Единственная причина, по которой id(1) == id(1)
заключается в том, что низкие целые числа кэшируются для производительности. Попробуйте id(1000) == id(1000)
Собственно, иногда это работает. Лучше тест выделяет вещи в разных положениях:
>>> x = 1
>>> y = 1
>>> id(x) == id(y)
True
>>> x = 1000
>>> y = 1000
>>> id(x) == id(y)
False
>>>
>>> id(1000) == id(1000)
True
То же самое может произойти и со строками, а при еще более условий:
>>> x = 'abcdefg'
>>> y = 'abcdefg'
>>> x is y
True
Суть заключается в том, что с помощью is
(или сравнения id()
значения, которые по сути являются одними и теми же, но медленнее), чтобы определить, идентичны ли два объекта, является лишь хорошей стратегией при определенных обстоятельствах, поскольку Python будет кэшировать объекты для производительности.
Один жесткие и быстрые правило, что два различных изменяемых объектов будут имеют различные id
значения, но как комментаторы ниже точки выхода, нет никаких гарантий относительно того, используется несколько неизменных объектов одного и те же значений будут или не будет создан.
Интерпретатор легче кэшировать, когда вы используете литеральные значения. Если вы сделаете это вычислить вещи, то вы можете увидеть, какие вещи она работает очень трудно кэш, против которых все это оппортунистически кэширует, потому что он заметил их в непосредственной близости:
>>> x = 1000
>>> y = 2000 // 2
>>> x is y
False
>>> x == y
True
>>> x = 1
>>> y = 2 // 2
>>> x is y
True
>>>
>>> x = 'abcdefg'
>>> y = 'abcdefg'
>>> x is y
True
>>> y = 'abc' + 'defg'
>>> x is y
True
>>> x = 'abcdefghijklmnopqrstuvwxyz'
>>> y = 'abcdefghijklmnopqrstuvwxyz'
>>> x is y
True
>>> y = 'abcdefghijklm' + 'nopqrstuvwxyz'
>>> x is y
False
>>> x == y
True
Связанные (не совсем DUP): HTTP: //stackoverflow.com/questions/306313/pythons-is-operator-behaves-unexpectedly-with-integers – NightShadeQueen