2010-05-09 12 views
15

¿Alguien puede explicar por qué el ejemplo con enteros da como resultado valores diferentes para xey y el ejemplo con la lista da como resultado que x e y son el mismo objeto?Python references

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

'y = lista (x)' * * –

+0

duplicados muchas veces a lo largo – SilentGhost

+0

WOW.! esto se ve exactamente como lo que estaba preguntando el mes pasado en http://stackoverflow.com/questions/2573135/2573965#2573965 – wescpy

Respuesta

8

Porque los enteros son inmutables, mientras que la lista es mutable. Puedes ver desde la sintaxis. En x = x + 1, en realidad está asignando un nuevo valor a x (está solo en el LHS). En x[0] = 4, llama al operador de índice en la lista y le da un parámetro; en realidad es equivalente a x.__setitem__(0, 4), lo que obviamente está cambiando el objeto original, no creando uno nuevo.

+0

¿No es posible obtener referencias a objetos inmutables? – hekevintran

+3

Todas las "variables" son referencias. La diferencia es que no puedes cambiar objetos inmutables. Una vez que se crean, nunca cambian; cualquier intento de cambio creará un nuevo objeto. –

+2

Establecer "asignar un nuevo valor a x" es falso y potencialmente confuso. Lo que está sucediendo es que una referencia a un nuevo objeto (resultado de x + 1) está vinculada al nombre x. Python no tiene el concepto de lvalue/rvalue ya que todo está referenciado, por lo que la distinción es importante. –

0

Esto se debe a que cuando tiene una lista o una tupla en python crea una referencia a un objeto. Cuando dice que y = x hace referencia al mismo objeto con y como x lo hace. Así que cuando edite el objeto de x y cambia con él.

+0

Menos confusa que la respuesta aceptada. –

+2

"cuando tienes una lista o una tupla" es bastante engañoso. – Ryan

+0

Sí, lo siento. Lo que quería decir es que no importa cuál de los dos, ya que ambos son inmutables. – Bloeper

4

Si lo hace y = x, Y y X son la referencia al mismo objeto. Pero los números enteros son inmutables y cuando lo hace x + 1, se crea el nuevo número entero:

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

Cuando se tiene un objeto mutable (por ejemplo, lista, clases definidas por usted mismo), X es cambiado cada vez y se cambia, porque señalan a un solo objeto.

0

Como las respuestas anteriores indicaron que el código que escribió asigna el mismo objeto a diferentes nombres, tales alias. Si desea asignar una copia de la lista original a la nueva variable (objeto en realidad) uso de esta solución:

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