2011-12-15 4 views
0

사전을 통해 변수를 처리 할 수 ​​있는지 알고 싶습니다.사전을 사용하여 변수를 처리하십시오.

예 :

global MyVar 
... 
MyVar = 0xFFFF 
d={"MyVar":MyVar} 
def ChangeVar (var_to_change, value) 
d[var_to_change] = value #I know this code assigns a new value to the key... 
... 
ChangeVar("MyVar",25) 
... 

내가 수정되는 변수 "선택"하는 사전을 사용하고 싶습니다. 나는 항상 배열을 사용할 수 있지만 이것을 수행 할 수 있는지 알고 싶습니다. 필자는 파이썬에서 포인터에 대해 잘 모른다. C에서

이 같은 것 (어쩌면 내가 추가 작성 또는 놓친 '*') :

int MyCVar = 0; 
int MyCVar2 = 0; 
int *MyD[] = {&MyCVar,&MyCVar2}; 
... 
*(MyD[index]) = some_value; 

난 당신이 내가 설명하려고 이해 바랍니다.

조나단 감사

편집 : 가 귀하의 답변에 대한 여러분 모두 감사합니다. 파이썬이 이름과 객체를 아주 다르게 처리했기 때문에 제가하려고했던 일은 아주 어려웠습니다.

class mytype(object): 
    def __init__(self,name=""): 
     self.__Name = name 
     .... 
     myDict[name] = self 

나는이 이름 변수의를 사용하여 모든 개체에 액세스 할 수 있습니다 내가 한 일은 이런 일이었다. 이것은 첫 번째 예제에서 설명하려고했던 동작입니다. 그리고 이것이 제가이 객체들에 접근하는 방법입니다.

myDict["MyVar"].Value = 1 

감사합니다. 귀하의 답변은 좋은 아이디어였습니다.

+2

무엇이 요점입니까? –

+3

그럴 필요가 없습니다 ...'locals() [ 'Myvar'] = 25' – JBernardo

답변

0

파이썬에는 이중 포인터 의미를 얻기위한 설탕이 없습니다. 원하는 값을 돌연변이시킬 수있는 일부 객체에 대한 참조를 전달해야합니다. 예를 들어 사전에 MyVar에 액세스 할 수있는 함수를 저장할 수 있습니다.

MyVar = 5 
def ChangeMyVar(value): 
    global MyVar 
    MyVar = value 
d['MyVar'] = ChangeMyVar 

# later.. 
d['MyVar'](10) 

신경 쓰이는 실제 값을 감싸는 객체를 지나치는 것이 좋습니다.

class WrappedVar(object): 
    def __init__(self, val): 
     self.value = val 

MyVar = WrappedVar(5) 
d['MyVar'] = MyVar 

# later.. 
d['MyVar'].value = 10 
+0

이것은 정확히 내가 한 일입니다. 감사합니다. – JohnnyDH

1

예, @JBernardo가 올바른 생각을 가지고 있다고 생각합니다.

을 당신은 모든 변수 이름의 사전을 만들려고하고, 룩업 테이블로 그 사전을 사용

당신이하려고했던 정확히 & 그림을 사용해 코드에서 잠시 쳐다보고 후 값 변경?

http://docs.python.org/library/functions.html#globals

globals()["MyVar"] = 25 

모든 로컬 (글로벌) 변수가 이미 사전에 배치됩니다 파이썬에서 정수 값 25

1

에 글로벌 MyVar를 재 할당 할 것이다, 그래서 당신은 무엇을 할 수 있는지 그 접근입니다 사전.

locals() 및 globals() 함수를 사용하여 수행 할 수 있습니다.

즉 : 그것은 그러나 사용하지 않는 것이 좋습니다

locals()['x'] = 'whatever' 

이 사전의

내용은 수정할 수 없습니다; 변경 사항은 인터프리터가 사용하는 지역 변수의 값에 영향을 미치지 않을 수 있습니다. doc

에서

실패 간단한 경우 :

def test(): 
    a = 'a' 
    locals()['a'] = 'b' 
    print a 
test() 

전역()는 OTOH 수정 될 안전하다.

관련 문제