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 + 10
은 UnboundLocalError
이됩니다. 왜 그런 오류가 없습니까?
이 스레드 http://stackoverflow.com/questions/12810426/differences-between-class-block-and-function-block-in-python은 동일한 문제를 언급하지만 강력한 설명은 제공하지 않습니다. PEP-0227 및 python 2.7 실행 모델은 함수 블록이나 클래스 블록의 차이를 만들지 않습니다. – user3022222
이것은 일반적인 범위 지정 문제입니다. 다음과 같은''과''사이의 네임 스페이스의 차이점에 주목하십시오. 차이점은'__main__' 네임 스페이스입니다. –
VooDooNOFX
또한이 내용은 http://stackoverflow.com/questions/12810426/differences-between-class-block-and-function-block-in-python과 매우 밀접하게 관련되어 있습니다. – VooDooNOFX