es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ámbito de las variables en Python: colisión entre el ámbito global y local.

Basado en las diferentes condiciones utilizadas en una comprobación condicional de “if”, los ámbitos globales y locales de la variable se ven afectados.

Intenté ejecutar el siguiente código en varios entornos de desarrollo integrados (IDE) en línea, y casi todos arrojan el mensaje de error en la mayoría de las ejecuciones, pero no en todas.

¿Alguien puede aclarar la razón de este comportamiento?

Ejemplo de código 1:

Dentro de la definición de la función, fuera de la condición “if”, la variable no tiene ningún valor y arroja un error, pero no en todas las ejecuciones.

import random

a = 10

def f():
    if(random.randint(0,1) == 1):
    #if(True):
        a = 5
        print(f'Dentro del if a es: {a}')
    print(f'Fuera del if a es: {a}')

print(f'Antes y fuera de f() a es: {a}')
f()
print(f'Después y fuera de f() a es: {a}')

Y la salida es:

Antes y fuera de f() a es: 10
Error no controlado (del último llamado): variable local 'a' referenciada antes de la asignación

Ejemplo de código 2:

Dentro de la definición de la función, fuera de la condición “if”, la variable tiene el valor local en lugar del valor asignado globalmente.

import random

a = 10

def f():
    #if(random.randint(0,1) == 1):
    if(True):
        a = 5
        print(f'Dentro del if a es: {a}')
    print(f'Fuera del if a es: {a}')

print(f'Antes y fuera de f() a es: {a}')
f()
print(f'Después y fuera de f() a es: {a}')

Y la salida es:

Antes y fuera de f() a es: 10
Dentro del if a es: 5
Fuera del if a es: 5
Después y fuera de f() a es: 10
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basado en los ejemplos de código proporcionados, el comportamiento observado se debe a las reglas de alcance de Python. Cuando una variable se define dentro de una función, el alcance de la variable es local a esa función. En el caso del Ejemplo de código 1, donde la variable ‘a’ se define dentro del bloque ‘if’, si la condición ‘if’ no se satisface, la variable ‘a’ queda sin definir, lo que resulta en el error ‘UnboundLocalError’ al intentar acceder a ella fuera del bloque ‘if’.

    En el Ejemplo de código 2, cuando se satisface la condición ‘if’, la variable ‘a’ se define con un valor local de 5, y cuando la función continúa ejecutándose fuera del bloque ‘if’, utiliza el valor local definido dentro de la función en lugar del valor global de 10. Cuando la función termina, la variable local se destruye, dejando inalterada la variable global.

    Por lo tanto, al utilizar condiciones dentro de bloques ‘if’ que redefinen variables, es esencial tener en cuenta que si una variable se define dentro de un bloque ‘if’, es posible que no sea accesible fuera del bloque ‘if debido a las reglas de alcance.

Comments are closed.