2015-08-13 9 views
1
a = 1 
b = 1 
id(a) == id(b) 
a = 1.0 
b = 1.0 
id(a) != id(b) 

Почему, когда a и b являются десятичными идентификаторами (a)! = Id (b) в python?
, когда число является десятичным python, создаст два объекта?Почему a = 1, b = 1, id (a) == id (b), но a = 1.0, b = 1.0, id (a)! = Id (b) в python?

+0

Связанные (не совсем DUP): HTTP: //stackoverflow.com/questions/306313/pythons-is-operator-behaves-unexpectedly-with-integers – NightShadeQueen

ответ

7

Единственная причина, по которой 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 
+0

Такая же идея, как и с 'Integer.valueOf (1)' в Java. – Thilo

+0

Да, но a = 1000, b = 1000, id (a) == id (b) - False. когда я запускаю «id (1000) == id (1000)» в shell всегда верно. – Pegasus

+0

@Pegasus. В любом случае, точное поведение, скорее всего, зависит от реализации и не подлежит спецификации языка. Как программист, вы не должны зависеть от получения того же (или другого) экземпляра объекта здесь. – Thilo

Смежные вопросы