как ссылка работает в Python Integer против списка?в списке оба значения одинаковы, почему в целочисленном разделе значение не равно 2? - PullRequest
0 голосов
/ 17 марта 2019

Список ссылок, добавить код

a = [1,2,3,4,5]
b = a
b.append(6)
print(a)
print(b)
#ans:
[1,2,3,4,5,6]
[1,2,3,4,5,6]

Целочисленная ссылка в int

a = 1
b = a
b +=1
print(a)
print(b)
#ans:
1
2

как работает ссылка в Python Integer vs list? в списке оба значения одинаковы, почему в целочисленном разделе значение не равно 2?

1 Ответ

0 голосов
/ 17 марта 2019

В 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'

Длинный и худой?Вы просто назначаете указатель на новое имя, но оба имени указывают на один и тот же объект в памяти! Примечание: Это , а не , то же самое, что мелкая копия , поскольку не создается внешний составной объект.

...