2012-02-25 5 views
2
>>> import sys 
>>> print(sys.version) 
2.4.4 
>>> b = 11 
>>> def foo2(): 
... a = b 
... print a, b 
... 
>>> foo2() 
11 11 
>>> def foo3(): 
... a = b 
... b = 12 
... print a, b 
... 
>>> foo3() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo3 
UnboundLocalError: local variable 'b' referenced before assignment 
>>> def foo4(): 
... global b 
... a = b 
... b = 12 
... print a, b 
... 
>>> foo4() 
11 12 

질문>foo3에서, 당신은 왜 그것을 선언하지 않고 전역 변수에 액세스 할 수 있지만 여전히 수정할 수 없습니다.왜 전역 값을 읽을 수는 있지만 수정할 수는 없습니까?

+3

이렇게하면 이해가됩니다. – delnan

답변

4

global 선언이 없으면 Python 컴파일러는 각 함수의 전체 코드를 검색하여 이 함수 코드 내에서에 할당 된 것을 확인합니다. foo3()에서 사용자는 ab을 모두 할당하므로 둘 다 함수 내에서 로컬 변수로 처리됩니다.

a = b을 수행하는 시점에서 b에는 아직 값이 지정되어 있지 않으므로 (아무 것도 지정하지 않았으므로) 메소드 코드가 실행될 때. 따라서 UnboundLocalError이 표시됩니다.

이 함수의 변수를 사용하면 항상은 아직 아무 것도 할당되지 않은 경우에도 동일한 위치를 나타냅니다.

+0

그래서'foo2'는 작동합니다. b/c'b'는 값이 할당되지 않았고 가능한 전역 변수로 취급됩니다. – q0987

+1

@ q0987 : 수정하십시오. 파이썬은 지역 변수와 전역 이름 공간을 검색하여 변수를 읽습니다. –

3

실수로 전역 변수를 눌렀을 때 오류가 자주 발생합니다. 따라서 변수를 수정하기 전에 변수 global을 선언하는 것이 좋습니다.

항상 로컬이 아닌 변수 global을 선언하면 고통이됩니다. 모든 일을하는 경우에만 전역 변수를 사용할 수 있습니다. 그러나 함수의 어느 곳에서나 x를 수정하려고한다면 무엇이든을 사용하기 전에 전역으로 선언해야합니다.

+1

전역 변수를 사용하는 것이 종종 가독성과 명료성으로 인해 함수 내부에서 나쁜 생각이지만, 전역 변수를 자주 액세스/수정하는 것은 지역 변수를 사용하는 것보다 느리다는 점에 유의해야합니다. – Anorov

관련 문제