2010-05-09 2 views
15

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

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

'у = лист (х)' * * –

+0

надуть много раз – SilentGhost

+0

ничего себе.! это выглядит так же, как то, что я просил в прошлом месяце в http://stackoverflow.com/questions/2573135/2573965#2573965 – wescpy

ответ

8

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

+0

Невозможно получить ссылки на неизменяемые объекты? – hekevintran

+3

Все «переменные» - это ссылки. Разница в том, что вы не можете изменять неизменяемые объекты. Как только они создаются, они никогда не меняются - любые попытки изменения создадут новый объект. –

+2

Утверждение «присвоение нового значения x» является неискренним и потенциально запутанным. Случается, что ссылка на новый объект (результат x + 1) связана с именем x. Python не имеет понятия lvalue/rvalue, поскольку все ссылается - поэтому различие важно. –

0

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

+0

Менее запутанный, чем принятый ответ. –

+2

«когда у вас есть список или кортеж», довольно вводит в заблуждение. – Ryan

+0

Да, я сожалею об этом. Я хотел сказать, что это не имеет значения, какой из двух, поскольку они оба неизменны. – Bloeper

4

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

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

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

0

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

>>> 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] 

 Смежные вопросы

  • Нет связанных вопросов^_^