[PYTHON] 내 전역 변수에 파이썬으로 할당 할 수없는 이유는 무엇입니까?
PYTHON내 전역 변수에 파이썬으로 할당 할 수없는 이유는 무엇입니까?
파이썬 범위 지정 규칙을 이해하려고 할 때 심각한 문제가 있습니다.
다음 스크립트를 사용하십시오.
a = 7
def printA():
print "Value of a is %d" % (a)
def setA(value):
a = value
print "Inside setA, a is now %d" %(a)
print "Before setA"
printA()
setA(42)
print "After setA"
printA()
예상치 못한 (나에게) 결과물을 제공합니다.
Before setA Value of a is 7 Inside setA, a is now 42 After setA Value of a is 7
a의 값을 마지막으로 인쇄하는 것이 42가 아닌 곳에서 이루어지기를 기대합니다. 7. 전역 변수의 범위 지정을위한 파이썬의 범위 규칙에 대해서는 무엇을 놓치고 있습니까?
해결법
-
==============================
1.전역 변수는 특별합니다. 함수에 변수 a = 값을 지정하려고하면 같은 이름의 전역 변수가 있더라도 함수 내에 새 로컬 변수가 만들어집니다. 대신 전역 변수에 액세스하려면 함수 내에 전역 명령문을 추가하십시오.
전역 변수는 특별합니다. 함수에 변수 a = 값을 지정하려고하면 같은 이름의 전역 변수가 있더라도 함수 내에 새 로컬 변수가 만들어집니다. 대신 전역 변수에 액세스하려면 함수 내에 전역 명령문을 추가하십시오.
a = 7 def setA(value): global a # declare a to be a global a = value # this sets the global value of a
파이썬의 네이밍 및 바인딩 규칙에 대한 자세한 설명은 네이밍 및 바인딩을 참조하십시오.
-
==============================
2.이것을 이해하는 속임수는 =를 사용하여 변수에 대입 할 때 변수를 로컬 변수로 선언한다는 것입니다. 따라서 전역 변수 a의 값을 변경하는 대신 setA (value)는 전달 된 값으로 지역 변수 (a)를 실제로 설정합니다.
이것을 이해하는 속임수는 =를 사용하여 변수에 대입 할 때 변수를 로컬 변수로 선언한다는 것입니다. 따라서 전역 변수 a의 값을 변경하는 대신 setA (value)는 전달 된 값으로 지역 변수 (a)를 실제로 설정합니다.
이것은 setA (value)의 시작 부분에 a의 값을 다음과 같이 출력하려고하면 더욱 분명해진다.
def setA(value): print "Before assignment, a is %d" % (a) a = value print "Inside setA, a is now %d" % (a)
이 Python을 실행하려고하면 유용한 오류가 발생합니다.
Traceback (most recent call last): File "scopeTest.py", line 14, in setA(42) File "scopeTest.py", line 7, in setA print "Before assignment, a is %d" % (a) UnboundLocalError: local variable 'a' referenced before assignment
이것은 파이썬이 setA (value) 함수가 a라는 지역 변수를 가지기로 결정했다는 것을 알려주고,이 변수는 함수에서 할당 할 때 변경합니다. 함수에 (printA ()와 같이) 할당하지 않으면 파이썬은 전역 변수 A를 사용합니다.
변수를 전역 변수로 표시하려면 전역 변수를 사용할 범위에서 Python의 global 키워드를 사용해야합니다. 이 경우 setA (value) 함수 내에 있습니다. 그래서 스크립트는 다음과 같습니다.
a = 7 def printA(): print "Value of a is %d" % (a) def setA(value): global a a = value print "Inside setA, a is now %d" %(a) print "Before setA" printA() setA(42) print "After setA" printA()
이 한 줄 추가는 파이썬에게 setA (value) 함수에서 변수 a를 사용할 때 지역 변수가 아닌 전역 변수에 대해 말한 것입니다.
-
==============================
3.파이썬에는 다른 언어로 변수 개념이 없습니다. "어딘가에있는"객체가 있고이 객체에 대한 참조가 있습니다. =는 현재 네임 스페이스의 참조에 이러한 개체를 할당하는 데 사용됩니다.
파이썬에는 다른 언어로 변수 개념이 없습니다. "어딘가에있는"객체가 있고이 객체에 대한 참조가 있습니다. =는 현재 네임 스페이스의 참조에 이러한 개체를 할당하는 데 사용됩니다.
값이 참조하는 객체를 참조하는 setA 함수의 네임 스페이스에 이름 a를 만듭니다.
-
==============================
4.함수 내에서 a는 지역 변수로 취급됩니다.
함수 내에서 a는 지역 변수로 취급됩니다.
함수 내부
-
==============================
5.함수의 실행은 함수의 지역 변수에 사용되는 새로운 기호 테이블을 도입합니다. 보다 정확하게는 함수의 모든 변수 할당은 로컬 심볼 테이블에 값을 저장합니다. 변수 참조는 먼저 로컬 심볼 테이블을 검색 한 다음, 둘러싸는 함수의 로컬 심볼 테이블에서 찾은 다음 전역 심볼 테이블에서 찾은 다음 마지막으로 내장 된 이름 테이블에서 찾습니다. 따라서 전역 변수는 전역 변수에 이름이 지정되지 않은 한 함수 내에서 직접 값을 할당 할 수는 있지만 참조 할 수는 있습니다.
함수의 실행은 함수의 지역 변수에 사용되는 새로운 기호 테이블을 도입합니다. 보다 정확하게는 함수의 모든 변수 할당은 로컬 심볼 테이블에 값을 저장합니다. 변수 참조는 먼저 로컬 심볼 테이블을 검색 한 다음, 둘러싸는 함수의 로컬 심볼 테이블에서 찾은 다음 전역 심볼 테이블에서 찾은 다음 마지막으로 내장 된 이름 테이블에서 찾습니다. 따라서 전역 변수는 전역 변수에 이름이 지정되지 않은 한 함수 내에서 직접 값을 할당 할 수는 있지만 참조 할 수는 있습니다.
from https://stackoverflow.com/questions/929777/why-does-assigning-to-my-global-variables-not-work-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서리스트 삽입하기 [duplicate] (0) | 2018.10.08 |
---|---|
[PYTHON] 파이썬, TypeError : unshashable 타입 : 'list' (0) | 2018.10.08 |
[PYTHON] 람다 식을 사용하여 pyqt의 슬롯 연결 (0) | 2018.10.08 |
[PYTHON] 초심자 파이썬 : 동일한 파일 읽기 및 쓰기 (0) | 2018.10.08 |
[PYTHON] 파이썬을 사용하여 문자열에서 URL을 추출하는 가장 깨끗한 방법은 무엇입니까? (0) | 2018.10.08 |