2013-11-22 6 views
7

python (2.7.6에서 테스트)에서 모든 변수는 컴파일시에 정적으로 범위에 바인드 된 입니다. 이 과정은 가 http://www.python.org/dev/peps/pep-0227/ 설명하고 http://docs.python.org/2.7/reference/executionmodel.html정적 바인딩이 클래스와 함수에서 다르게 작동하는 이유는 무엇입니까?

이 명시 적으로 이름 바인딩 작업하면 것은 어디 코드 블록 내에서, 블록 내 이름의 모든 사용은 현재에 대한 참조로 취급되어 발생 "고 적혀있다 잘 블록."

함수가 x 는 사용 후 할당 실패하기 때문에 다음과 같은 코드 때문에 코드 블록이다 (따라서, 컴파일 시간에 그 로컬 정의 그것은 함수 어딘가에 할당되지만 때문에 실행 시 그것을 바인딩되기 전에 사용됩니다).

x = 1 
def f(): 
    print x 
    x = 2 
    print x 

>>> f() 

Traceback (most recent call last): 
    File "<pyshell#46>", line 1, in <module> 
    f() 
    File "<pyshell#45>", line 2, in f 
    print x 
UnboundLocalError: local variable 'x' referenced before assignment 

클래스는 코드 블록, 그래서 우리는 정확히 같은 행동을 관찰해야한다. 그러나 이것은 내가 관찰하는 것이 아닙니다. 이 예를 살펴 보겠습니다 : 클래스 정의 코드 블록은

x = 1 
class C(): 
    y = x + 10 
    x = 2 
    def __init__(self): 
     print C.y 

>>> C.x 
2 
>>> C.y 
11  
>>> C() 
11 
<__main__.C instance at 0x00000000027CC9C8> 

,이 블록 내 모든 할당은 변수 지역을해야한다. 따라서 x은 클래스 C에 국한되어야하므로 y = x + 10UnboundLocalError이됩니다. 왜 그런 오류가 없습니까?

+0

이 스레드 http://stackoverflow.com/questions/12810426/differences-between-class-block-and-function-block-in-python은 동일한 문제를 언급하지만 강력한 설명은 제공하지 않습니다. PEP-0227 및 python 2.7 실행 모델은 함수 블록이나 클래스 블록의 차이를 만들지 않습니다. – user3022222

+0

이것은 일반적인 범위 지정 문제입니다. 다음과 같은''과''사이의 네임 스페이스의 차이점에 주목하십시오. 차이점은'__main__' 네임 스페이스입니다. – VooDooNOFX

+0

또한이 내용은 http://stackoverflow.com/questions/12810426/differences-between-class-block-and-function-block-in-python과 매우 밀접하게 관련되어 있습니다. – VooDooNOFX

답변

3

예 - 문서가 오도 된 것 같습니다. 당신이 함수와 같은 일을하려고하면 10, 120, 30, 0

, 당신의 첫 번째 액세스상의 UnboundLocalError를 얻을 :에

global_one = 0 

class A(object): 
    x = global_one + 10 
    global_one = 100 
    y = global_one + 20 
    del global_one 
    z = global_one + 30 

a = A() 
print a.x, a.y, a.z, global_one 

결과 : 클래스 정의는 실제로 다른 일반 블록으로 상당히 동일하게 작동하지 않습니다 global_one.

일반 클래스 정의는 부모 범위에 액세스 할 수 있지만 모든 이름 할당은 로컬 범위를 수정하지 않지만 실제로 클래스의 데이터 특성 사전에 캡처됩니다. 이 문서에 대한 힌트가 있지만 확실하지는 않습니다.