python - title()




En Python, ¿qué es una declaración global? (4)

¿Qué es una declaración global ? ¿Y cómo se usa? He leído la definición oficial de Python ;
Sin embargo, no tiene mucho sentido para mí.


Básicamente, le dice al intérprete que la variable que se le da debe modificarse o asignarse a nivel global, en lugar del nivel local predeterminado.


Cada "variable" en python está limitada a un cierto alcance. El alcance de un "archivo" de python es el módulo-alcance. Considera lo siguiente:

#file test.py
myvariable = 5  # myvariable has module-level scope

def func():
    x = 3       # x has "local" or function level scope.

Los objetos con alcance local mueren tan pronto como la función sale y nunca se pueden recuperar (a menos que los return ), pero dentro de una función, puede acceder a variables en el alcance a nivel de módulo (o cualquier alcance que contenga):

myvariable = 5
def func():
    print(myvariable)  # prints 5

def func2():
    x = 3
    def func3():
        print(x)       # will print 3 because it picks it up from `func2`'s scope

    func3()

Sin embargo, no puede usar la asignación en esa referencia y esperar que se propague a un ámbito externo:

myvariable = 5
def func():
    myvariable = 6     # creates a new "local" variable.  
                       # Doesn't affect the global version
    print(myvariable)  # prints 6

func()
print(myvariable)      # prints 5

Ahora, finalmente estamos a global . La palabra clave global es la forma en que le dice a Python que una variable en particular en su función está definida en el ámbito global (nivel de módulo).

myvariable = 5
def func():
    global myvariable
    myvariable = 6    # changes `myvariable` at the global scope
    print(myvariable) # prints 6

func()
print(myvariable)  # prints 6 now because we were able 
                   # to modify the reference in the function

En otras palabras, puede cambiar el valor de myvariable en el módulo-alcance desde la func si usa la palabra clave global .

Como un lado, los ámbitos pueden ser anidados arbitrariamente profundos:

def func1():
    x = 3
    def func2():
        print("x=",x,"func2")
        y = 4
        def func3():
            nonlocal x  # try it with nonlocal commented out as well.  See the difference.
            print("x=",x,"func3")
            print("y=",y,"func3")
            z = 5
            print("z=",z,"func3")
            x = 10

        func3()

    func2()
    print("x=",x,"func1")

func1()

Ahora, en este caso, ninguna de las variables se declara en el ámbito global, y en python2, no hay una forma (fácil / limpia) de cambiar el valor de x en el ámbito de func1 desde func3 . Es por eso que la palabra clave nonlocal se introdujo en python3.x. nonlocal es una extensión de global que le permite modificar una variable que haya seleccionado de otro ámbito en cualquier ámbito del que se extrajo.


mgilson hizo un buen trabajo, pero me gustaría agregar algo más.

list1 = [1]
list2 = [1]

def main():
    list1.append(3)
    #list1 = [9]
    list2 = [222]

    print list1, list2


print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2    
>>> [1, 3] [1]

Dentro de una función, Python asume cada variable como una variable local, a menos que la declare como global, o esté accediendo a una variable global.

list1.append(2) 

fue posible porque está accediendo a la 'lista1' y las listas son mutables.

list2 = [222]

fue posible porque estás inicializando una variable local.

Sin embargo, si elimina el comentario # list1 = [9], obtendrá

UnboundLocalError: local variable 'list1' referenced before assignment

Significa que está intentando inicializar una nueva variable local 'list1' pero ya se hizo referencia anteriormente y está fuera del alcance para reasignarla.

Para ingresar al alcance, declare 'list1' como global.

Te recomiendo que leas this aunque haya un error al final.


a = 1

def f():
    a = 2 # doesn't affect global a, this new definition hides it in local scope

a = 1

def f():
    global a
    a = 2 # affects global a




global