2012-06-03 19 views
6

Me encontré con un problema extraño en Python al usar variables globales.Comprender la variable global en Python

que tienen dos módulos (archivos): mod1.py y mod2.py

mod1 intentos de modificar la variable global var definido en mod2. Pero el var en mod2 y var en mod parece ser dos cosas diferentes. Por lo tanto, el resultado muestra que tal modificación no funciona.

Aquí está el código:

#code for mod2.py 
global var 
var = 1 
def fun_of_mod2(): 
    print var 

#code for mod1.py 
from mod2 import var,fun_of_mod2  
global var #commenting out this line yields the same result 
var = 2 #I want to modify the value of var defined in mod2 
fun_of_mod2() #but it prints: 1 instead of 2. Modification failed :-(

Cualquier pista sobre por qué sucede esto? ¿Y cómo puedo modificar el valor de val definido en mod2 en mod1?

Gracias

Respuesta

11

Al importar var en mod1:

from mod2 import var,fun_of_mod2 

usted le está dando el nombre varen el espacio de nombres mod1. Es como si usted hizo esto:

import mod2 
var = mod2.var 
fun_of_mod2 = mod2.fun_of_mod2 
del mod2 

En otras palabras, ahora hay dos nombres para el valor, mod1.var y mod2.var. Son los mismos al principio, pero cuando reasigna mod1.var, mod2.var sigue apuntando a lo mismo.

Lo que se quiere hacer es:

import mod2 

continuación, acceder y asignar la variable como mod2.var.

Es importante tener en cuenta que las variables globales en Python no son verdaderamente globales. Son globales solo para el módulo en el que están declaradas. Para acceder a variables globales dentro de otro módulo, usa la sintaxis module.variable. La instrucción global se puede usar dentro de una función para permitir que se asigne un nombre global de módulo (sin él, la asignación a una variable la convierte en una variable local en esa función). No tiene otro efecto.

+0

+1, pero para responder completamente a la pregunta, debe mencionar lo que 'global' hace. El principal problema del PO parece ser un malentendido donde es útil. – lvc

+0

buen punto, agregó algunas cosas sobre eso. – kindall

+0

Gracias, creo que lo entendí. – xiaohan2012