Nonlocal en Python

nonlocal en python

 

La sentencia nonlocal en Python es una declaración simple que se utiliza para crear variables en funciones anidadas (una función dentro de una función) cuyo ámbito local no esta definido, es decir, no está en el ámbito local ni global.

Qué es el ámbito de una variable

Antes de comenzar con los ejemplos, conviene conocer este concepto importante en programación en general, así que vamos a repasarlo.

El ámbito de una variable se podría definir como el lugar desde el cual se puede acceder a esta variable, es decir, llamarla para usarla de alguna forma.

Por ejemplo, si declaras una variable dentro de una función no podrás acceder a esta variable fuera de esta función porque el ámbito es la función.

Funciones anidadas sin utilizar nonlocal en Python

En este primer ejemplo vamos a ver un ejemplo de dos funciones anidadas sin utilizar nonlocal, para comprender bien como funciona el √°mbito de una variable seg√ļn su declaraci√≥n.

def f1(): 
    x = 1 
    def f2(): 
        x = 2 
        print("En f2:",id(x)) 
    f2() 
    print("En f1:",id(x))

f1()

En el código podemos ver una variable x declarada en la función f1 y otra variable x dentro f2. Digo otra variable porque no es la misma, y aquí es donde entra en juego nonlocal.

Llegados a este punto quizás te preguntes por qué son variables distintas si la función f2 esta dentro de f1. La respuesta es el ámbito de declaración, ya que, aunque se llamen igual y pueda parecer que están dentro del mismo ámbito, no lo están.

Lo que estamos haciendo en el código es imprimir el identificador de la variable, que demostrará que las variables son distintas:

En f2: 10914528
En f1: 10914496

Como se puede observar los identificadores son diferentes, es decir, podemos confirmar que las variables son distintas.

Ejemplo de nonlocal en Python

Después de ver cuál es problema que se nos puede plantear al programar funciones anidadas, vamos a ver como solucionarlo de forma muy sencilla con nonlocal.

Vamos a utilizar el mismo c√≥digo, pero con una peque√Īa diferencia, designar x dentro de f2 como nonlocal:

def f1(): 
    x = 1 
    def f2(): 
        nonlocal x
        x = 2 
        print("En f2:",id(x)) 
    f2() 
    print("En f1:",id(x))

f1()

Si ejecutamos podemos ver cual es el identificador que se imprime en cada caso:

En f2: 10914528
En f1: 10914528

Como se puede apreciar, se imprime el mismo valor, lo que significa que estamos tratando con la misma variable.

La funcionalidad de nonlocal ser√≠a ¬ęunir¬Ľ estas dos variables en una sola, por eso en la introducci√≥n se dijo que el √°mbito de la variable no queda definido.


 

 

 

Deja un comentario