2010-07-30 3 views
0

특히, 클래스의 메소드에 정의 된 자유 변수는 어떻게됩니까? 아마이 같은 것입니다 :Python에서 무료 변수에 대한 검색 순서는 무엇입니까?

  1. 둘러싸 기능 (일시적으로) 범위 => 생성 폐쇄
  2. 글로벌 (영구) 범위 => (메소드 본문이 실행될 때 그냥 찾아 볼)
  3. 더 폐쇄를 생성하지

    globalname = 0 
    class Test(object): 
        def method(self): 
         print globalname 
         print Test 
    
    def outer(): 
        localname = 1 
        class Test(object): 
         def method(self): 
          print globalname 
          print localname 
          print Test 
        return Test 
    
    Test().method.__func__.__closure__ 
    # None 
    outer()().method.__func__.__closure__ 
    # (<cell at 0xb7d655b4: type object at 0x82412bc>, <cell at 0xb7d655cc: int object at 0x81b20b0>) 
    

    것은 내가 찾을 수 없습니다 : 인상 UnboundLocalError()

는 다음 두 가지 예 정의 시간에 어떻게 다루어 지는지에 대한 많은 문서화. 위의 설명이 맞습니까?

답변

2

파이썬은 현재 코드 블록 내에서 변수가 할당 된 경우에만 변수가 로컬이라고 가정합니다. 그래서

spam = 0 
def ham: 
    print(spam) 

스팸 전역 변수하게되지만,

spam = 0 
def ham: 
    spam = 0 
    print(spam) 

ham 로컬 별도의 변수를 만들 것입니다. 클로저는 엔 클로징 스코프의 모든 변수를 가져옵니다. 첫 번째 예제에서는 지역 변수가 없으므로 종결되지 않습니다. 두 번째에는 localname이 할당되고 따라서 method은 클로저입니다.

언제나 파이썬에서이 가정을 둘러싼 방법이 있습니다. global 키워드는 변수를 전역 (!)으로 선언하므로 예 :

spam = 0 
def ham: 
    global spam 
    spam = 0 
    print(spam) 

하지는 폐쇄 될 것입니다. Py3k는 nonlocal 키워드를 소개합니다. 키워드는 Python이 변수 이름을 찾아서 참조 할 때까지 범위를 위로 보게합니다.

+0

P. 이것은 기본적으로 파이썬에 대해 비 직관적이라고 생각하는 유일한 것입니다. – katrielalex

관련 문제