В Python все является объектом.Все это имя для адреса (указатель) для документов .
На этой странице вы можете прокрутить вниз и найти следующее:
Числовые объекты неизменны;после создания их значение никогда не меняется
При этом вы увидите определенный тип int
, поэтому вполне логично, что ваш второй пример работает.
В верхней части этой страницы вы найдете следующее:
Каждый объект имеет идентификатор, тип и значение.Идентичность объекта никогда не меняется после его создания;вы можете думать об этом как об адресе объекта в памяти.
Python ведет себя так же, как C и Java, в том смысле, что вы не можете переназначить, куда указывает указатель на имя.Python, как и Java, также передается по значению и не имеет семантики для передачи по ссылке.
Глядя на ваш первый пример:
>>> a = 1
>>> hex(id(a))
'0x7ffdc64cd420'
>>> b = a + 1
>>> hex(id(b))
'0x7ffdc64cd440'
>>> print(a)
1
>>> print(b)
2
Здесь показаночто операция b = a + 1
оставляет a
в 1
, а b
теперь 2
.Это потому, что int
является неизменным, имена, которые указывают на значение 1
, всегда будут указывать на один и тот же адрес:
>>> a = 1
>>> b = 2
>>> c = 1
>>> hex(id(a))
'0x7ffdc64cd420'
>>> hex(id(b))
'0x7ffdc64cd440'
>>> hex(id(c))
'0x7ffdc64cd420'
Теперь это верно только для значений от -5
до 256
в реализации C , кроме того, вы получаете новые адреса, но показанная выше изменчивость сохраняется.Я показал вам разделение адресов памяти по причине.На этой же странице вы найдете следующее:
Типы влияют практически на все аспекты поведения объекта.Даже важность идентичности объекта зависит в некотором смысле: для неизменяемых типов операции, которые вычисляют новые значения, могут фактически возвращать ссылку на любой существующий объект с тем же типом и значением, в то время как для изменяемых объектов это недопустимо.Например, после а = 1;b = 1, a и b могут или не могут ссылаться на один и тот же объект со значением один, в зависимости от реализации, но после c = [];d = [], c и d гарантированно ссылаются на два разных, уникальных, недавно созданных пустых списка.(Обратите внимание, что c = d = [] назначает один и тот же объект как c, так и d.)
Итак, ваш пример:
>>> a = [1, 2, 3, 4, 5]
>>> hex(id(a))
'0x17292e1cbc8'
>>> b = a
>>> hex(id(b))
'0x17292e1cbc8'
Я мог бы остановиться прямо здесьОчевидно, что и a
, и b
ссылаются на один и тот же объект в памяти по адресу 0x17292e1cbc8
.Это потому, что вышесказанное все равно что сказать:
# Lets assume that `[1, 2, 3, 4, 5]` is 0x17292e1cbc8 in memory
>>> a = 0x17292e1cbc8
>>> b = a
>>> print(b)
'0x17292e1cbc8'
Длинный и худой?Вы просто назначаете указатель на новое имя, но оба имени указывают на один и тот же объект в памяти! Примечание: Это , а не , то же самое, что мелкая копия , поскольку не создается внешний составной объект.