capitalize - En Python, ¿qué es una declaración global?




title in (5)

¿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í.


Answers

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

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.


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.


Puede usar una variable global en otras funciones declarándola como global en cada función que la modifique

Python quiere asegurarse de que realmente sabes con qué estás jugando al requerir explícitamente la palabra clave global.

Ver esta respuesta


He hecho una solución (relativamente) flexible y reutilizable para esto. Se puede encontrar en GitHub como esta esencia . Si el resultado de la función de cambio es llamable, se llama automáticamente.







python global