Ссылки на Python

Может кто-нибудь объяснить, почему пример с целыми значениями приводит к различным значениям для x и y, а пример с результатом списка в x и y является одним и тем же объектом?

x = 42
y = x
x = x + 1
print x # 43
print y # 42

x = [ 1, 2, 3 ]
y = x
x[0] = 4
print x # [4, 2, 3]
print y # [4, 2, 3]
x is y # True

Ответы

Ответ 1

Поскольку целые числа являются неизменяемыми, тогда как список изменен. Вы можете видеть из синтаксиса. В x = x + 1 вы фактически присваиваете новое значение x (он один на LHS). В x[0] = 4 вы вызываете оператор индекса в списке и предоставляете ему параметр - он фактически эквивалентен x.__setitem__(0, 4), который, очевидно, меняет исходный объект, а не создает новый.

Ответ 3

Если вы выполняете y = x, y и x являются ссылкой на один и тот же объект. Но целые числа неизменяемы, и когда вы выполняете x + 1, создается новое целое число:

>>> x = 1
>>> id(x)
135720760
>>> x += 1
>>> id(x)
135720748
>>> x -= 1
>>> id(x)
135720760

Когда у вас есть изменяемый объект (например, список, классы, определенные вами самим), x изменяется при изменении y, поскольку они указывают на один объект.

Ответ 4

Это потому, что, когда у вас есть список или кортеж в python, вы создаете ссылку на объект. Когда вы говорите, что y = x, вы ссылаетесь на тот же объект с y, что и x. Поэтому, когда вы редактируете объект x y, он меняет его.

Ответ 5

Как и в предыдущих ответах, написанный вами код присваивает одному и тому же объекту разные имена, такие псевдонимы. Если вы хотите назначить копию исходного списка новой переменной (фактически объект) используйте это решение:

>>> x=[1,2,3]
>>> y=x[:] #this makes a new list
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> x[0]=4
>>> x
[4, 2, 3]
>>> y
[1, 2, 3]