Ссылки на 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)
, который, очевидно, меняет исходный объект, а не создает новый.
Ответ 2
Лучшее объяснение, которое я когда-либо читал, здесь:
http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables
Ответ 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]