2009-08-15 21 views
26

¿Cómo funcionan las variables globales en Python? Sé que las variables globales son malvadas, solo estoy experimentando.¿Por qué no puedo establecer una variable global en Python?

Esto no funciona en python:

G = None 

def foo(): 
    if G is None: 
     G = 1 

foo() 

Me aparece un error:

UnboundLocalError: local variable 'G' referenced before assignment 

¿Qué estoy haciendo mal?

Respuesta

56

Se necesita el global declaración:

def foo(): 
    global G 
    if G is None: 
     G = 1 

En Python, las variables que se asigna a las variables locales convertido por defecto. Debe usar global para declararlos como variables globales. Por otro lado, las variables que se refieren pero no asignan a no se convierten automáticamente en variables locales. Estas variables se refieren a la variable más cercana en un ámbito adjunto.

Python 3.x presenta la declaración nonlocal que es análoga a global, pero vincula la variable a su ámbito de delimitación más cercano. Por ejemplo:

def foo(): 
    x = 5 
    def bar(): 
     nonlocal x 
     x = x * 2 
    bar() 
    return x 

Esta función devuelve 10 cuando se llama.

+0

s/variables/names/g s/assign to/bind to/g –

+1

Sí, se puede usar una terminología diferente, pero siempre que Python hable de "variables" y "asignación" en el mensaje de error (como aparece en la pregunta original), creo que dicha terminología es perfectamente aceptable al explicar el problema. –

+0

¡Punto tomado! La referencia del lenguaje no siempre es siempre consistente en el asunto, tampoco. –

6

todavía tiene que declarar G como global, desde dentro de esa función:

G = None 

def foo(): 
    global G 
    if G is None: 
     G = 1 

foo() 
print G 

que simplemente se da salida a

1 
2

Definir G como global en la función como esta:

#!/usr/bin/python 

G = None; 
def foo(): 
    global G 
    if G is None: 
     G = 1; 
    print G; 

foo(); 

El pitón anterior imprime 1.

Uso de variables globales como esto es una mala práctica porque: http://c2.com/cgi/wiki?GlobalVariablesAreBad

8

Es necesario declarar G como global, pero en cuanto a por qué: cuando se hace referencia a una variable dentro de una función, si configurar la variable en cualquier lugar en esa función, Python supone que es una variable local. Entonces, si una variable local con ese nombre no existe en ese punto del código, obtendrá el UnboundLocalError. Si realmente quiso referirse a una variable global, como en su pregunta, necesita la palabra clave global para decirle a Python que eso es lo que usted quiso decir.

Si no se asigna a la variable en ninguna parte de la función, pero solo tiene acceso a su valor, Python usará la variable global con ese nombre, si existe. Por lo que podría hacer:

G = None 

def foo(): 
    if G is None: 
     print G 

foo() 

impresiones de este código None y no tirar la UnboundLocalError.

Cuestiones relacionadas