Кто-то может объяснить, почему пример с целыми числами приводит к различным значениям для 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
Потому что целые числа неизменяемы, а список - изменчив. Это видно по синтаксису. В x = x + 1
вы фактически присваиваете новое значение x
(это единственное значение на LHS). В x [0] = 4
вы вызываете оператор индекса в списке и даете ему параметр - он фактически эквивалентен x .__ setitem __ (0, 4)
, который очевидно, изменяет исходный объект, а не создает новый.
Если вы сделаете y = x
, y и x будут ссылками на один и тот же объект. Но целые числа неизменны, и когда вы выполняете x + 1
, создается новое целое число:
>>> x = 1
>>> id(x)
135720760
>>> x += 1
>>> id(x)
135720748
>>> x -= 1
>>> id(x)
135720760
Когда у вас есть изменяемый объект (например, список, классы, определенные вами), x изменяется всякий раз, когда изменяется y. , потому что они указывают на один объект.
Это потому, что когда у вас есть список или кортеж в python, вы создаете ссылку на объект. Когда вы говорите, что y = x, вы ссылаетесь на тот же объект с y, что и с x. Поэтому, когда вы изменяете объект x, y изменяется вместе с ним.
Как сказано в предыдущих ответах, написанный вами код присваивает одному и тому же объекту разные имена, такие псевдонимы. Если вы хотите присвоить копию исходного списка новой переменной (собственно объекту) используйте это решение:
>>> 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]
Лучшее объяснение, которое я когда-либо читал, находится здесь: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables