Python: ¿Es posible crear una variable global con el nombre dado como cadena?
Frecuentes
Visto 220 veces
2
Puedo crear una variable global en una función:
def f():
global x
x=1
f()
print x
Pero, ¿puedo hacer lo mismo si solo tengo el nombre de esa variable en f()?
def f(varname):
exec('global ' + varname)
exec(varname + '=1')
f('x')
print x
Esto no funciona: "el nombre 'x' no está definido". No me digas que este es un estilo de programación terrible, lo sé. La pregunta es si esto es posible de hacer en Python.
Gracias por las respuestas, pero queda la pregunta de por qué exec no funcionó. ¿Se ejecuta de alguna manera en un contexto diferente? ¿Es parte de un módulo diferente, por lo que crea una variable global en un módulo diferente?
4 Respuestas
4
In [1]: globals()['x'] = 42
In [2]: x
Out[2]: 42
Funciona de la misma manera si se hace desde dentro de una función.
contestado el 03 de mayo de 12 a las 16:05
¡Gracias por la respuesta! ¿Puedes explicar por qué mi versión no funcionó? Sospecho que hay algo mal con el contexto del ejecutivo. - user1084871
@ user1084871: Yo también, pero no puedo identificarlo. - NPE
4
sí, puedes usar globales () para eso:
globals()['whatever'] = 123
(y es bueno que te des cuenta de que este no es un muy buen estilo)
contestado el 03 de mayo de 12 a las 16:05
2
Usar la función global
globals()[varname] = value
La función globals devuelve un dict que contiene las variables globales del módulo.
contestado el 03 de mayo de 12 a las 16:05
1
Podrías ver las otras respuestas.
Pero realmente no deberías.
No es que las variables globales sean automáticamente una mala idea; el mayor problema es que mirar una simple llamada a f()
or f(x)
, no tiene idea de que acaba de modificar su alcance local (es decir, en este caso, global).
def f():
return 1
x = f()
print x
hace exactamente lo mismo, pero documenta lo que sucede en el ámbito dentro de ese ámbito.
contestado el 03 de mayo de 12 a las 16:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python scope or haz tu propia pregunta.
Casi todo es posible, pero cosas como esta nunca son una buena idea (obviamente, hay excepciones, pero las personas que pueden decidir eso no tienen que preguntar cómo se hace, aunque no necesariamente al revés). - user395760