Причина вы видите это происходит потому, что вы думаете в терминах переменных, a
, b
и c
являющихся объектами, когда на самом деле это целые числа, которые являются объектами вашего примера. Расположение памяти, что вы смотрите на то, когда вы набираете id()
это место для int
объекта 1
и int
объект 2
, а не имена переменных a
, b
и c
.
В python имена привязаны к объектам. Это может быть проблематично, если у вас есть такие типы, как lists
, которые изменяются, и вы пытаетесь их скопировать. Изменение объекта означает, что при опросе обеих ссылок вы видите изменение, распространяемое в обоих, и это не всегда то, что вы намереваетесь, и если вы не знаете об этом, это может вызвать множество проблем с отладкой.
Обратно к вашему примеру, я добавил два примера id()
в начале, чтобы показать идентификаторы целочисленных объектов 1
и 2
. Это должно разъяснить вам все.
>>> a = 1
>>> b = a
>>> c = a
>>> id(a)
4298174296
>>> id(b)
4298174296
>>> id(c)
4298174296
>>> id(1)
4298174296
>>> id(2)
4298174272
>>> a += 1
>>> id(a)
4298174272
>>> id(b)
4298174296
>>> id(c)
4298174296
>>> b += 1
>>> print a, b, c
2 2 1
>>> id(c)
4298174296
>>> id(b)
4298174272
>>> id(a)
>>> 4298174272
Как вы можете видеть, место для 1
и a b c
изначально все-таки и место для 2
отличается. Затем, когда вы меняете назначение на a
, оно указывает на местоположение 2
, а b
и c
остается на 1
.Затем, когда вы переназначаете b
, он указывает на место для 2
, оставив только c
, указывая на 1.
Надеюсь, что это разъяснит вам.
Пожалуйста, ознакомьтесь с http://nedbatchelder.com/text/names.html. Также обратите внимание, что вторая часть вашего вопроса - это деталь реализации - CPython ставит мелкие целые числа, это не поведение, на которое вы должны положиться. – jonrsharpe