2011-02-14 2 views
3

다음 잘 작동합니다 다음 그러나_to_에 할당 된 변수 이름이 왜 값 조회에 영향을 미칩니 까? 파이썬에서

def test_foo(): 
    class Foo(object): 
     pass 
    class Fam(object): 
     bar = Foo 

test_foo() 

NameError: name 'Foo' is not defined와 함께 실패

def test_foo(): 
    class Foo(object): 
     pass 
    class Fam(object): 
     Foo = Foo 

test_foo() 

가 왜 에 할당하고있어 이름이되고있는 값의 조회에 영향을 미치지 않습니다 배정 된?

답변

6

클래스 정의 내에서 Foo 이름을 지정한다는 사실만으로도 해당 범위의 로컬 이름 (예 : 클래스의 범위)이 Foo이됩니다. 로컬 이름은 구문 분석 및 바이트 코드로 컴파일하는 동안 정적으로 결정됩니다. 실행 결과가 문에 도달하면

Foo = Foo 

파이썬은 먼저 오른쪽을 계산합니다. 컴파일 중 결정된 로컬 이름 Foo을 조회하고 로컬 범위에서 찾지 못합니다. 따라서 오류. `블록 :

당신이 명확성을 위하여

def test_foo(): 
    foo = 3 
    class A: 
     bar = foo 
     foo = 42 

test_foo() 
+2

을 시도하려는 경우 같은 일이 일어날 것입니다, 당신은'데프 test_foo()에 위의 코드를 삽입하는 것이 좋습니다. 모듈의 전역 범위에'foo'를 써서 쓰면,이 코드는 에러를 발생시키지 않습니다! – senderle

+0

감사합니다. 개인적으로 나는 그것이 성가신 것을 알지만, 나는 거기에 좋은 이유가 있다고 확신한다. – Singletoned

+0

@ 싱글 톤 : 주된 이유는 속도입니다. 바이트 코드에 이미 정보를 찾을 수 있기 때문에 로컬 변수를 찾는 것이 훨씬 빠릅니다. 이런 이유로 코드는 전역 범위에서보다 함수 내에서 더 빠르게 실행되는 경우가 많습니다. –

관련 문제