2012-07-27 18 views
5

Soy nuevo en Python (y de todos modos no sé mucho sobre programación), pero recuerdo haber leído que python generalmente no copia valores por lo que cualquier declaración a = b hace que b apunte a a. Si me quedopython byRef // copy

a = 1 
b = a 
a = 2 
print(b) 

da el resultado 1. En caso de que no sea 2?

Respuesta

10

No, el resultado debería ser 1.

Think del operador de asignación (=) como la asignación de una referencia.

a = 1 #a references the integer object 1 
b = a #b and a reference the same object 
a = 2 #a now references a new object (2) 
print b # prints 1 because you changed what a references, not b 

Toda esta distinción es realmente más importante cuando se trata de mutables objetos como lists en contraposición a inmutables objetos como int, float y tuple.

Ahora consideremos el siguiente código:

a=[] #a references a mutable object 
b=a #b references the same mutable object 
b.append(1) #change b a little bit 
print a # [1] -- because a and b still reference the same object 
     #  which was changed via b. 
+0

gracias por esa explicación. Pensé que con a = 2, cambiaría cualquier cosa que apunte de 1 a 2, pero por lo que dices, parece que cambié hacia a dónde apunta (a 2 en lugar de 1) – user1266138

+0

@ user1266138 - Sí. Esa es una forma apropiada de pensarlo. (aunque en python solemos decir "referencia" en lugar de "punto", pero eso es solo semántica). – mgilson

3

Al ejecutar b = a, hace que B se refieren al mismo valor se refiere a una. Luego, cuando ejecuta a = 2, hace referencia a un nuevo valor. b no se ve afectado.

Las reglas acerca de la asignación de Python:

  1. Asignación simplemente hace que el nombre se refiere al valor.

  2. La asignación a un nombre nunca afecta a otros nombres que hacen referencia al valor anterior.

  3. Los datos nunca se copian implícitamente.

0

Puede ver lo que esperaba con solo un pequeño cambio. De hecho, las dos variables comienzan apuntando al mismo objeto, y si ese objeto es mutable, puede ver un cambio en ambos lugares a la vez.

>>> a = [1] 
>>> b = a 
>>> a[0] = 2 
>>> print b 
[2] 

lo que hizo con su ejemplo fue cambiar a por lo que ya no se hace referencia al objeto 1 sino más bien al objeto 2. Eso dejó b todavía refiriéndose al 1.

2

@mgilson tiene un gran answer pero me resulta un poco más difícil de entender. Estoy poniendo esta respuesta como un intento de explicarlo de una manera diferente.

a = 1 # This makes a point to a location in memory where the Integer(1) is located 
b = a # This makes b point to the same place. 
a = 2 # This makes a point to a different location in memory where Integer(2) is located 
print(b) # b still points to the place where Integer(1) was stored, so it prints out 1. 
+0

gracias por aclarar – user1266138