Python 범위에 대해 자세히 알아보기

8353 단어 pythonwebdev
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, 좋은 디자인입니다.

좋은 웹페이지 즐겨찾기