2012-04-23 1 views
3

을주는 : 나는 다음과 같은 출력을 얻을바르() 나는이 코드를 실행하면 파이썬은 다른 출력

a = '1' 
vars()['a'] = '2' 
print a 

:

def bar(): 
    a = '1' 
    vars()['a'] = '2' 
    print a 

bar() 
:

2 

하지만를이 코드를 실행하면

다음 출력을 얻었습니다 :

1 

이제 제 질문이 그 이유입니다. 어떻게하면 두 번째 사례가 첫 번째 사례와 동일한 솔루션을 제공하게 할 수 있습니까?

편집 : 나에게 결과를 얻을 수

def bar(): 
    a = "a" 
    b = "b" 
    exec a+"="+b 
    print a 

bar() 

을 : 정말 해결책을 찾기하지만 난 주위에 작은 해킹을 발견 ... 차라리 간부 사용하지거야하지만 할 수 없습니다

: 사람이 더 나은 솔루션을 찾을 수 있다면

b 

그것은 좋은 것입니다. 이런 식으로 전역 변수를 설정하거나 미친 일을하지 않으므로 걱정하지 마십시오.

+2

나는이 클래스가 아무런 차이가 없다고 생각한다. 이것은 지역 대 전역 범위의 문제이다. – delnan

+1

또한 전역 변수를 함수 내에서이 방식으로 설정하려고한다면, 당신은 무언가 잘못된 것을하고있을 것입니다. – 9000

답변

2

새 스타일 클래스가 기본 __dict__ 동작을 재정의하여이 사용을 깨뜨린 것처럼 보입니다. vars(). 구식 클래스에 영향을주는 이유는 확실하지 않지만 관련성이 있습니다. 문서에서

(http://docs.python.org/library/functions.html#vars) :


vars([object]) 돌아 모듈, 클래스, 인스턴스에 대한 __dict__ 속성, 또는 기타 __dict__ 특성을 가진 개체

모듈 및 인스턴스와 같은 객체에는 업데이트 가능한 __dict__ 속성이 있습니다. 그러나 다른 객체에는 __dict__ 속성에 쓰기 제한이있을 수 있습니다 (예 : 새 스타일 클래스는 dictproxy를 사용하여 직접 사전 업데이트를 방지합니다).

인수가 없으면 vars()는 locals()와 같이 작동합니다. locals dictionary는 locals 사전에 대한 업데이트가 무시되기 때문에 read에만 유용합니다.


당신은 아마도 self. = val 또는 setattr(self, 'x', val)이 클래스의 경우에 작동하지 않습니다 이유에 대해 언급 할 수?

+3

문서의이 부분이 핵심 인 것처럼 보입니다. "지역 정보 사전은 업데이트가 현지 사용자 사전에 대한 업데이트가 무시되므로 유용합니다." 즉, vars()가 반환하는 모든 것을 수정하지 않아도됩니다. –

+0

클래스 파트를 제거 할 수 있고 여전히 동일한 문제가 있으므로 클래스와 아무 관계가 없다고 생각합니다. 나는 그 문제가 그 기능 안에 있다고 믿는다. 나는 자아를 시험했다. = val과 setattr (self, 'x', val)하지만 여전히 같은 결과를 얻습니다. – Dragonfly

1

vars()의 결과는 지정되지 않습니다. 그래서 다른 시나리오 및/또는 파이썬 버전 및/또는 구현에서 다른 결과를 낼 수 있습니다. 이 방법을 사용하여 지역 변수를 변경할 수있는 소름 끼치는 소리가 들리 겠지만 (정규식 groupdict 결과를 한 번 사용하려고 시도한 적이 있음), 이것은 매우 이식 불가능하며 언제든지 중단 될 수 있습니다.