2012-01-10 24 views
7

¿Es posible crear variables locales con código Python, dado solo el nombre de la variable (una cadena), de modo que las llamadas subsiguientes a "'xxx' en locals()" devolverán True?¿Es posible crear dinámicamente variables locales en Python?

Aquí es una representación visual:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> (...some magical code...) 
>>> 'iWantAVariableWithThisName' in locals() 
True 

Por lo propósito requiero este engaño es otro tema por completo ...

Gracias por la ayuda.

+0

Se advierte contra pero se puede hacer en Python 2.x utilizando la función exec - pero no en 3.0: http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

"Para qué propósito requiero este engaño es otro tema completamente ..." - y ** es infinitamente más importante **. Haga la pregunta que corresponda a lo que realmente desea hacer, no la pregunta que se relaciona con la forma en que cree que desea hacerlo. –

+0

Karl: MitchellSalad señala en un comentario a continuación que está usando un diccionario en su lugar, una buena opción. –

Respuesta

9

Si realmente quiere hacer esto, se podía utilizar exec:

print 'iWantAVariableWithThisName' in locals() 
junkVar = 'iWantAVariableWithThisName' 
exec(junkVar + " = 1") 
print 'iWantAVariableWithThisName' in locals() 

Por supuesto, a nadie le dirá la peligrosa y hacker usando Exec es, pero también lo será cualquier aplicación de este "astucia."

+1

Heh. Incluso usamos oraciones muy similares, ¡hasta el uso de cursivas! - indicar que el OP probablemente no debería estar haciendo esto. Supongo que realmente debería haber una forma obvia de (explicar por qué no debería) hacerlo ... – DSM

+0

Sí, pero el suyo establece junkVar en Ninguno, y el mío lo establece en 1. Eso marca la diferencia. :) +1 al tuyo –

+0

Esto solo funcionaría en Python 2, ya que deshabilita la optimización local. * Tu función se ejecutará más lento * cuando hagas esto. No funcionará en absoluto en Python 3. –

6

Puede jugar juegos y actualizar locals() manualmente, lo que algunas veces funcionará, pero no debería hacerlo. Está específicamente advertido en contra en los documentos. Si yo tuviera hacer esto, probablemente utilizar exec:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> exec(junkVar + '= None') 
>>> 'iWantAVariableWithThisName' in locals() 
True 
>>> print iWantAVariableWithThisName 
None 

Pero noventa y tres veces de cada cien que realmente desea utilizar un diccionario en su lugar.

+0

Gracias por la respuesta. Para esta instancia específica, la llamada del ejecutivo se ve mucho más sabrosa que administrar un diccionario, debido a la gran cantidad de nombres de variables que produce mi código. ¿Puede explicar un poco más sobre lo que quiere decir que el ejecutivo "a veces" está trabajando? EDITAR: Un diccionario funcionará bien. No hay necesidad de elaborar. :) – MitchellSalad

+0

Lo que "a veces" funciona es la actualización del diccionario local, no el uso de exec. Por ejemplo: 'locals() [" myvar "] = 1'. Los [documentos] (http://docs.python.org/library/functions.html#locals) dicen: "Nota: El contenido de este diccionario no debe modificarse; los cambios pueden no afectar los valores de las variables locales y gratuitas utilizadas. por el intérprete ". –

+1

@MitchellSalad: no, quise decir que actualizar locals() - es decir, locals() ['junkVar'] = 99 - es ligeramente peligroso, y anti-recomienda .. exec debe funcionar, a pesar de los problemas de seguridad. Sin embargo, no estoy seguro de compartir sus gustos: las * más * variables que tenía, era más probable que las envuelva en un diccionario. – DSM

-1

No es necesario usar exec, pero los locales() [cadena], o vars() o globales() también funcionan.

test1="Inited" 

if not "test1" in locals(): locals()["test1"] = "Changed" 
if not "test1" in locals(): locals()["test2"] = "Changed" 

print " test1= ",test1,"\n test2=",test2 
+1

Intenta eso en una función y no funcionará. – pyrospade

Cuestiones relacionadas