2012-04-18 1 views
0

변수 참조를 저장하고 해당 참조가 가리키는 값을 할당 할 수있는 python dict를 사용하고 싶습니다.Python dicts에서 변수 참조 및 설정

foo = "foo" 
d = {'foo' : foo} 
d['foo'] = "bar" 
foo 
// output: 'foo', but I want it to be 'bar'. 

어떻게하면됩니까?

편집 : 실제 코드가 있습니다.

settings = values["settings"] // This is a dict, such as {"metoder_alphasort" : "on"} 
field_map = {"metoder_alphasort" : profile.metoder_alphasort} 
for setting in field_map.keys(): 
    if settings.has_key(setting): 
     if settings[setting] == 'on': 
      field_map[setting] = True 
# field_map[setting] is now True, but profile.metoder_alphasort is False 
+2

왜 'foo ='bar''을 할 수 없습니까? 왜 당신은 사전을 사용하고 있습니까? 진짜 문제가 뭐니? –

+2

___이 작업을 수행하지 마십시오 .____. 예, 가능하지만 잘못된 것입니다. 사전에 프로그래밍 방식으로 액세스해야하는 경우에는 사전을 사용하고 그렇지 않은 경우에는 변수를 사용하십시오. 둘 다 사용할 수는 없습니다. – agf

+0

내가 딕트를 사용하고있는 것은 변수 이름을 나타내는 문자열 인 키와 변수 자체의 값을 포함하는지도입니다. 열쇠에만 접근 할 때 exec 사용을 피하고 싶습니다. –

답변

1

. 문자열 (및 불리언 및 튜플 ...)은 변경할 수 없기 때문에 예상대로 작동하지 않습니다. 따라서 변경하면 원래의 개체/변수를 편집하지 않고 새 문자열을 만들 수 있습니다.

1

문자열이 변경되지 않으므로 아이디어가 작동하지 않습니다. 값은 변경되지 않고 대신 바뀝니다.

class MutableString: 
    def __init__(self, string): 
     self.string = string 

    def __str__(self): 
     return self.string 

    def __repr__(self): 
     return "MutableString("+repr(self.string)+")" 

    def set(self, string): 
     self.string = string 

foo = MutableString("foo") 
d = {'foo' : foo} 
d['foo'].set("bar") 
print(foo) 

우리에게 출력으로 bar을 제공합니다 : 당신이 정말로 그것을 이런 식으로 할 필요를 느꼈다 경우 당신이 뭔가를 할 수 있습니다.

또 다른 옵션은 __setitem__()으로 덤프하는 대체 dict 하위 클래스를 만들어 원하는 결과를 얻을 수 있습니다. 문제는 다른 사람들이 코드를 읽는 것이이 물건이 어떻게 작동하는지 기대하지 않는다는 것입니다. 이런 종류의 일에 의존하지 않도록 코드를 변경하는 것이 훨씬 낫습니다.

+0

아무도 "이런 식으로해야 할 필요성"을 느끼지 않아야합니다. 또한 OP가하는 일이 아닙니다. –

+0

@RikPoggi 단순히 OP가 원하는대로 작동하지 않는 이유를 설명하는 것뿐입니다. –

+0

* "다음과 같은 작업을 수행 할 수 있습니다."* 및 * "다른 옵션은"* 작동하지 않는 이유를 설명하지 않지만 불량 사례를 제안합니다. OP가 필요로하는 것은 올바른 데이터 구조가 자신의 나쁜 설계에 대한 해킹이 아니라는 것입니다. –

2

파이썬은 객체에 대한 참조를 구현하지만 변수에 대한 참조를 구현하지 않습니다.

foo = "foo" 
def readfoo(newval): 
    return foo 
d["foo"] = readfoo 
foo = "bar" 
d["foo"]() # returns "bar" 
foo = "baz" 
d["foo"]() # returns "baz" 

이를하지만, 읽기 전용 지역 기능은 외부 범위에서 바르 읽기 전용 수 있기 때문에 (나는 거기에 파이썬 3을 믿는 : 당신은 읽기 전용 로컬 기능을 사용하여 로컬 변수에 바인딩을 만들 수 있습니다 이 변경하는 nonlocal 키워드).

실제로 달성하고자하는 것에 따라 가장 간단한 해결 방법은 하나의 요소 목록을 대신 사용하는 것입니다. 이 방법 당신은 일반적으로 참조 할 수있는 개체 (목록)에 값을 포장 : 설정이 DICT에 당신은 대안으로 setattr(profile, "mtoder_autoalpha", newvalue)을 사용할 수 있습니다

foo = ["foo"] 
d["foo"] = foo 
d["foo"][0] = "bar" 
foo[0] # prints "bar"