Python: ¿Es posible crear una variable global con el nombre dado como cadena?

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?

preguntado el 03 de mayo de 12 a las 16:05

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). -

4 Respuestas

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

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

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

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 or haz tu propia pregunta.