2011-12-06 16 views
5

Primero voy a comenzar como todos los demás. Soy nuevo en Python. Mi maestro me dio el problema:Python scoping mutable vs inmutable

def f(a, b, c): 
    a = 1 
    c = b 
    c[0] = 2 
a = 10 
b = [11, 12, 13] 
c = [13, 14, 15] 
f(a, b, c) 
print a, b, c 

Imprime:

10 [2, 12, 13] [13, 14, 15] 

que entender que una estancias en 10, porque los números enteros son inmutables, pero yo no entiendo por qué b y c cambios no lo hace .

+2

También señalaría que esto no tiene que ver con que los tipos de datos sean mutables/inmutables. Como lo señalan las respuestas a continuación, se trata de la asignación de variables. La página [El modelo de datos] (http://docs.python.org/reference/datamodel.html) analiza esa diferencia. – Rob

+0

lo que te confunde son solo los nombres de las variables, supongo. dé a los que están fuera de la función diferentes nombres, es decir, x, y, z, de modo que quiera llamar a f (x, y, z) e imprimir x, y, z. Y estoy seguro de que no será tan difícil de ver. – Danny

Respuesta

4
c = b 
c[0] = 2 

Puesto que usted está configurando c para apuntar a b, Sólo podría hacer tan fácilmente esto:

def f(a, b, unused): # notice c isn't in the parameter list 
    a = 1 
    c = b # c is declared here 
    c[0] = 2 # c points to b, so c[0] is b[0] 

Ahora es obvio que c es siempre el mismo que b, ¿por qué no acaba de quitar que:

def f(a, b, unused): 
    a = 1 
    b[0] = 2 

y ahora es claro que se está cambiando el primer elemento de b y no hacer nada para c, y recuerde, esto es funcionalmente idéntico al original.

2

La clave es entender las variables como punteros bajo el capó:

def f(a, b, c): 
    a = 1 # a is a single scalar value, so no pointing involved 
    c = b # point the local "c" pointer to point to "b" 
    c[0] = 2 # change the 2nd value in the list pointed to by "c" to 2 

Cuando se llama a f (a, b, c), solo se cambia b realidad. La variable "c" dentro de la implementación de la función es diferente de la implementación "c" fuera de la función.

0

a no conserva el valor de 10 porque es inmutable. Conserva el valor de 10 porque cuando llama al a = 1 en el ámbito local de f() crea una nueva variable.

Cuando llama al c = b dentro de f(), el c local se convierte en una referencia local al objeto mutable representado por b. Cuando vuelve a asignar los valores en ese objeto mutable, el cambio se refleja en el objeto original.