Tengo dos muestras:

Una:

import math

def my_function():
    print(math.pi)
    math.pi = 3
    print(math.pi)

my_function()

Salida:

3.141592653589793
3

Dos:

a = 0

def my_function():
    print(a)
    a = 3
    print(a)

my_function()

Salida:

UnboundLocalError: local variable 'a' referenced before assignment

Entonces, ¿cuál es la diferencia entre ellos? Pensé que tanto math.pi como a eran globales en este caso y deberían producir UnboundLocalError.

3
Tuyen Pham 31 oct. 2017 a las 00:15

3 respuestas

La mejor respuesta

Si realiza la asignación de variables dentro de la función, la variable global se ignorará y no será accesible dentro de la ejecución de la función, en la muestra con math lib no anulará el nombre math en sí mismo, por eso funciona. Recortado a continuación le daría el mismo error con math lib:

import math

def my_function():
  print(math.pi)
  math = 1

my_function()

Puede usar la declaración global antes de acceder a la variable, pero si va a hacer cualquier tarea luego anulará la variable global, por lo que SIEMPRE es mejor evitar hacerlo .

import math


def my_function():
  global math
  print(math.pi)
  math = 1

print(math) # -> <module 'math' from ...    
my_function() # -> 3.14159265359
print(math) # -> 1
3
Andriy Ivaneyko 30 oct. 2017 a las 21:24

En la primera función, la variable es math, no math.pi. Como no está asignando a math, no se convierte en una variable local. Asignar a un atributo de una variable no es lo mismo que asignar a la variable misma.

Si cambió la función a

def my_function():
    print(math.pi)
    math = 3
    print(math.pi)

Obtendrías el mismo tipo de error que en la segunda función:

UnboundLocalError: variable local 'matemática' referenciada antes de la asignación

1
Barmar 30 oct. 2017 a las 21:29

Esto ha sido respondido varias veces en SO antes.

Una variable es local para una función si hay una instrucción que la asigna dentro de esa función. En su caso, a = 3 define a como variable local dentro de su función. El primer print(a) intenta acceder a él, pero aún no se le ha asignado un valor.

Por eso ves:

UnboundLocalError: local variable 'a' referenced before assignment.

La instancia global creada por a = 0 no juega ningún papel aquí.

0
Christian Will 30 oct. 2017 a las 21:33