referenced - python global variable in function
advertencia de variable global en python (1)
La mejor manera directa de arreglar esto es eliminar la declaración global
de debajo if __name__ == ''__main__'':
No lo necesitas allí. A diferencia de algunos otros lenguajes, una instrucción if
no introduce un nuevo alcance en Python: cualquier variable que asigne en ese bloque es global, tal como lo sería if
no existiera.
Esto también explica por qué es un error: para declarar una variable como global
, no está permitido haber usado ese nombre de variable previamente en el mismo ámbito (presumiblemente porque sería confuso para la declaración global
hacer asignaciones antes de ir a la variable global, y Python no admite el mismo nombre que sea tanto global como local en el mismo ámbito). Como el if
no introduce un nuevo ámbito, la primera asignación a ret_code
está en el mismo ámbito que la declaración global bajo if
; pero la declaración global viene después de la asignación, lo cual no está permitido.
Para una solución aún mejor, considere si puede eliminar completamente el estado global mutable de su programa, ya que generalmente causa más problemas de los que vale la pena en algún lugar de la pista. Aquí, es probable que estés usando ret_code
como código de salida del programa, es decir, estarás haciendo sys.exit(ret_code)
algún lugar, pero estás decidiendo dentro de una función qué código de salida usar. En cambio, pase suficiente información de vuelta al código de nivel superior para que decida qué código de salida usar.
Esta pregunta ya tiene una respuesta aquí:
Tengo un script de Python 2.6 (sí, sé que debería actualizar a al menos 2.7) que se ve así:
ret_code = 0
def some_func()
global ret_code
...
if __name__ == ''__main__'':
global ret_code
...
Ahora recibo una advertencia si ejecuto el código: * SyntaxWarning: el nombre ''ret_code'' está asignado a antes de la declaración global global ret_code *
¿Por qué recibo esta advertencia?
Puedo resolver el problema al hacerlo:
def some_func()
global ret_code
...
if __name__ == ''__main__'':
global ret_code
ret_code = 0 #assign 0 here instead of above
...
Aún así eso no responde mi pregunta. ¿Qué está mal con el código original?