2012-01-10 3 views
7

변수의 이름 (문자열) 만 주어진 파이썬 코드로 로컬 변수를 생성 할 수 있습니까? 그러면 locals()의 "xxx"에 대한 후속 호출에서 True가 반환됩니다.파이썬에서 지역 변수를 "동적으로"생성하는 것이 가능합니까?

여기에 시각적있어 :

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

무엇 목적으로 위해 나는이 속임수는 완전히 다른 주제입니다 필요 ... 도움을

감사합니다. 얼마나 위험 및 간부가 사용 hackish

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

가, 누군가가 당신을 말할 것이다, 그러나 그래서이의 구현 될 것입니다 : 당신이 정말이 작업을 수행 할 경우

+0

그것은에 대해 경고되지만이 간부 ​​기능을 사용하여 파이썬 2.x를 수행 할 수 있습니다 -하지만 3.0 : http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

"어떤 목적으로이 속임수를 요구하는 것은 또 다른 주제입니다 ..."- ** 무한히 중요합니다 **. 당신이 정말로하고 싶은 일과 관련된 질문을 질문하십시오. 어떻게 생각 하느냐에 관한 질문이 아닙니다. –

+0

Karl : MitchellSalad는 아래의 주석에서 대신 사전을 사용하고 있다고 말합니다. 좋은 선택입니다. –

답변

9

, 당신은 exec 사용할 수 있습니다 "속임수."

+1

Heh. 우리는 심지어 매우 유사한 문장을 사용했습니다 - 이탤릭체를 사용하기까지했습니다! - OP가이 작업을 수행하지 않아야 함을 나타냅니다. 내 생각 엔 거기에 반드시 하나의 분명한 방법이 있어야한다. 왜 그렇게하지 말아야 하는지를 설명하라. – DSM

+0

네,하지만 junkVar를 None으로 설정하고 광산에서 1로 설정합니다. 모든 점에서 차이가 있습니다. :) +1 to yours –

+0

이것은 지역 최적화를 불가능하게하기 때문에 파이썬 2에서만 작동합니다. * 이렇게하면 기능이 느리게 실행됩니다. 파이썬 3에서는 전혀 동작하지 않을 것이다. –

6

때때로 게임을하고 지역 정보()를 수동으로 업데이트 할 수 있지만 때로는 작동하지 않아야합니다. 특히 문서에서 경고를받습니다. 나는 이 작업을 수행 할 수이 있다면, 아마 간부 사용하십시오 : 백 중

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

그러나 아흔셋 번 당신이 정말로 대신 사전을 사용하고 싶습니다.

+0

응답 해 주셔서 감사합니다. 이 특정 인스턴스의 경우 exec 코드는 내 코드가 생성하는 많은 수의 변수 이름 때문에 사전 관리보다 훨씬 맛있게 보입니다. 임원이 "때로는"일한다는 의미에 대해 좀 더 자세히 설명해 주시겠습니까? 편집 : 사전 잘 작동합니다. 정교하게 말할 필요가 없습니다. :) – MitchellSalad

+0

"때때로"작동하는 것은 exec를 사용하지 않고 지역 사전을 업데이트하는 것입니다. 예 :'locals() [ "myvar"] = 1'. [docs] (http://docs.python.org/library/functions.html#locals)에서는 다음과 같이 말합니다. "참고 :이 사전의 내용은 수정해서는 안되며 변경 사항은 사용 된 지역 변수 및 자유 변수의 값에 영향을 미치지 않을 수 있습니다 통역사가. " –

+1

@MitchellSalad : 아니오, 현지인() (즉, [[junkVar]] = 99)을 업데이트하는 것이 약간 위험하고 권장되지 않는 .. exec가 작동해야 함에도 불구하고 보안 문제가 있음을 의미합니다. 나는 당신의 취향을 나눌 지 확신하지 못한다. 내가 가진 변수가 많으면 많을수록 사전에 넣을 확률이 높다. – DSM

-1

exec를 사용할 필요가 없지만 locals() [string] 또는 vars() 또는 globals()도 작동합니다.

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

함수에서 사용 해보면 작동하지 않습니다. – pyrospade

관련 문제