Python 범위에 대해 자세히 알아보기
로컬 대 글로벌
전역 변수만 어디에서나 사용할 수 있습니다. 다른 변수는 프로그램의 특정 영역에 속합니다.
예를 들어, 함수 내부에서 생성된 모든 변수는 지역 변수입니다.
def mydef() :
a = "ah"
a
의 로컬 범위를 벗어나는 mydef()
에 액세스할 수 없습니다. 다음 코드는 범위 오류를 발생시킵니다.def mydef() :
a = "ah"
print(a)
올바른 코드는 다음과 같습니다.
def mydef() :
a = "ah"
print(a)
mydef()
비교적 쉽다고 생각할 수도 있지만 다음을 보십시오.
a = "ah"
def mydef() :
print(a)
mydef()
여전히 작동합니까? (화살표를 클릭하면 답을 찾을 수 있습니다.)
대답
예! 나는 단지 당신을 조금 놀리는 것입니다 ;)
여기에 재미있는 부분이 있습니다. 지금 다음 코드를 보십시오.
count = 0
def mycount() :
count = count + 1
print(count)
mycount()
작동 되나요? (화살표를 클릭하면 답을 찾을 수 있습니다.)
대답
아니! 이번에는 "할당 전에 참조된 로컬 변수 '카운트'"메시지와 함께 "UnboundLocalError"가 발생합니다.
다음 섹션에서 그 사례를 다룰 것입니다.
범위 오류 이해
이 "UnboundLocalError"는 무엇입니까?
물론 오류가 있지만 어떤 오류가 있습니까? 우리는 다음을 과제라고 부릅니다.
count = count + 1
함수 내에서 할당을 수행했기 때문에 컴파일러는 이제
count
를 전역 변수가 아닌 지역 변수로 간주합니다. 이것이 "할당 전에 참조된 로컬 변수 'count'"오류가 발생하는 이유입니다. 컴파일러는 할당되기 전에 count
를 읽습니다.Python 3에서는
count
가 전역 변수라고 명시적으로 말함으로써 이 문제를 해결합니다.count = 0
def mycount() :
global count
count = count + 1
print(count)
mycount()
전역에 대해 조금 더
이전 섹션에서 범위 오류의 예를 보았습니다. 이제 다음을 살펴보겠습니다.
count = 1
def mycount() :
print(count)
count += 110
mycount()
print(count)
작동 되나요? (화살표를 클릭하면 답을 찾을 수 있습니다.)
대답
예!
또 다른 질문이 있습니다. 첫 번째 인쇄의 결과는 무엇입니까? (화살표를 클릭하면 답을 찾을 수 있습니다.)
대답
두 번째 인쇄와 동일: 111.
헐....?
예, Python은 함수 내에서 할당하지 않는 한 암시적으로
count
를 전역 변수로 간주합니다.처음에는 이상하게 보일 수 있지만 이렇게 하면 Python은 잠재적인 원치 않는 부작용을 방지하려고 합니다.
로컬이 아닌 것은 무엇입니까?
Python 3에서는 지역도 전역도 아닌 변수에 대한
nonlocal
문을 도입했습니다.또 뭐...?
일반적으로 중첩 함수 내에서 이러한 변수를 사용합니다.
def mydef() :
a = "ah"
def mynested() :
nonlocal a
a = "ho"
mynested()
return a
print(mydef())
이 경우 전역 문이나 로컬 문은 이름 충돌을 해결할 수 없지만
nonlocal
문은 해결할 수 있습니다.LEGB 규칙
범위를 설명하는 또 다른 일반적인 방법은 변수가 존재하는 컨텍스트라고 말하는 것입니다.
Python 인터프리터는 특정 순서로 변수를 읽습니다.
Local -> Enclosing -> Global -> Built-in
각 범위는 다른 범위 안에 중첩됩니다. 마지막 범위는 기본 제공 범위입니다. Python은 특정 순서로 각 레벨을 탐색한 후 변수를 찾지 못하면 NameError를 발생시킵니다.
Source
보너스
내장 함수
globals()
및 locals()
를 사용하여 "매트릭스 보기"를 수행할 수 있습니다.def mydef() :
a = "ah"
def mynested() :
nonlocal a
a = "ho"
mynested()
print(locals())
return a
mydef()
print(globals())
전역 변수에 대해 표시되는 항목:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10c1f7550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'scopes.py', '__cached__': None, 'mydef': <function mydef at 0x10c1ac1e0>}
그리고 지역 변수의 경우:
{'mynested': <function mydef.<locals>.mynested at 0x108d12048>, 'a': 'ho'}
마무리
이 게시물을 즐겼기를 바랍니다. 파이썬에는 네 가지 범위가 있습니다. LEGB 규칙에 따라 변수를 읽습니다. Java 또는 C와 같은 다른 언어와 비교할 때 매우 독특한 방식으로 지역 및 전역 변수를 처리합니다.
IMHO, 좋은 디자인입니다.
Reference
이 문제에 관하여(Python 범위에 대해 자세히 알아보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jmau111/deep-dive-into-python-scopes-1786텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)