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
15
задан SilentGhost 9 May 2010 в 09:06
поделиться

5 ответов

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

8
ответ дан 1 December 2019 в 03:34
поделиться

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

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

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

4
ответ дан 1 December 2019 в 03:34
поделиться

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

0
ответ дан 1 December 2019 в 03:34
поделиться

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

>>> 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]
0
ответ дан 1 December 2019 в 03:34
поделиться

Лучшее объяснение, которое я когда-либо читал, находится здесь: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables

9
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: