2012-01-10 22 views
7

Czy możliwe jest utworzenie lokalnej zmienne z kodem Pythona, biorąc pod uwagę tylko nazwa zmiennej (ciąg), tak że kolejne wywołania „«xxx»w miejscowych()” powróci prawda?Czy można "dynamicznie" tworzyć zmienne lokalne w Pythonie?

Oto wizualny:

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

Na jakiej celu wymagam tego oszustwa jest zupełnie inny temat ...

Dzięki za pomoc.

+0

To jest ostrzegany przed, ale można to zrobić w Pythonie 2.x za pomocą funkcji exec - ale nie w wersji 3.0: http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

"W jakim celu wymagam, aby ta sztuczka była zupełnie innym tematem ..." - i jest nieskończenie ważniejsza **. Zadaj pytanie, które dotyczy tego, co naprawdę chcesz zrobić, a nie pytanie, w jaki sposób myślisz, że chcesz to zrobić. –

+0

Karl: MitchellSalad zauważa w komentarzu poniżej, że zamiast tego używa słownika - dobrego wyboru. –

Odpowiedz

9

Jeśli naprawdę chcesz to zrobić, można użyć exec:

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

Oczywiście, ktoś powie, jak niebezpieczne i hackish użyciu exec jest, ale niech tak będzie żadnych realizacja tego "naciągnięcie."

+1

Heh. Użyliśmy nawet bardzo podobnych zdań - nawet do kursywy! - wskazanie, że OP nie powinien tego robić. Chyba tak naprawdę powinno być oczywistym sposobem (wyjaśnić, dlaczego nie powinien) to zrobić .. – DSM

+0

Tak, ale twoje ustawia junkVar None, a kopalnia ustawia go na 1. To robi różnicę. :) +1 do Ciebie –

+0

To działałoby tylko w Pythonie 2, ponieważ wyłącza optymalizację miejscową. * Gdy to zrobisz, twoja funkcja będzie działać wolniej *. To nie zadziała w ogóle w Pythonie 3. –

6

Można grać w gry i aktualizować mieszkańców() ręcznie, co czasami działa, ale nie należy. Jest specjalnie ostrzeżony przed dokumentami. Gdybym miałaby to zrobić, to bym chyba użyć exec:

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

Ale dziewięćdziesiąt trzy razy na stu naprawdę chcesz używać słownika zamiast.

+0

Dzięki za odpowiedź. Dla tej konkretnej instancji wywołanie exec wygląda o wiele bardziej smacznie niż zarządzanie słownikiem, ze względu na ogromną liczbę nazw zmiennych, które generuje mój kod. Czy mógłbyś nieco bardziej rozwinąć to, co rozumiemy przez exec "czasami" działa? EDYCJA: Słownik będzie działał dobrze. Nie ma potrzeby opracowywania. :) – MitchellSalad

+0

Co "czasami" działa aktualizowanie słownika miejscowego, nie używając exec. Na przykład: 'locals() [" myvar "] = 1'. [Docs] (http://docs.python.org/library/functions.html#locals) powiedzieć: „Uwaga: Zawartość tego słownika nie powinny być zmieniane, zmiany mogą nie wpływać na wartości lokalnych i wolnych zmiennych stosowanych przez tłumacza. " –

+1

@MitchellSalad: nie, to oznacza, że ​​aktualizowanie miejscowych() - tj miejscowych() [ 'junkVar'] = 99 - jest nieco niebezpieczne i anty zalecany .. Exec powinny pracować, problemy z bezpieczeństwem Bez względu na przepisy. Nie jestem pewien, czy podzielę twoje upodobania: zmienne * więcej *, które miałem, tym bardziej prawdopodobne, że będę je zawijał do słownika. – DSM

-1

Nie ma potrzeby korzystania exec, ale miejscowi() [ciąg], lub Vars() lub globalne() również działa.

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

Spróbuj tego w funkcji i nie zadziała. – pyrospade