Scope rule

복준수·2025년 1월 1일
0

Python

목록 보기
2/5

Scope rule

Scope rule의 핵심은
어떤 객체를 참조할때 가까운 스택(namespace)를 참조하는 것이라고 할 수 있는것 같다.
python뿐만 아니라 JavaScript, C모두 비슷한 스코프룰을 가지고 있다.
규칙을 정리해보면 다음과 같다
특정 문법이 없는 상태에서

    1. 더 큰 범위의 스코프에서 안쪽 스코프의 변수를 참조할 수 없다.
    1. 작은 범위의 스코프에서 더 큰 범위의 스코프를 참조할 수 있다. 참조 우선순위는 가까운 스코프부터 진행된다.
    1. 다른 스코프에서 값을 할당 = 하는 것은 매우 제한적이다.

Global Scope

python의 경우 모든 것이 객체로 이루어져 있다.
다음과 같이 name이라는 변수에 str을 저장하면 해당 값이 저장된 주소namespace에 저장된다. 이렇게 전역변수가 저장되는 범위가 Global Scope이다.

name = "bokjunsoo"

Local Scope

해당 코드를 실행하면 global Scope에서 namespacename이라는 변수와 func함수의 주소가 저장된다.

name="bok june soo"

def func():
    name = "BOKJUNSOO"
    ### local scope 참조
    print(name)
func()

함수를 호출하면 해당 함수를 위한 namespace를 따로 만드는데, 이 스택Local Scope에 저장된다.

함수 스택을 만들고, 함수 스택 내부에는 또 다시 name이라는 객체가 생성되고 "BOKJUNSOO"라는 값이 할당된다.

print(name)으로 인해 name을 참조해야 하는데 가까운 Local scope부터 name 이라는 변수를 찾기 시작한다. 해당 Scope안에 name이라는 변수가 존재하므로 해당 값을 참조하여 출력한다.

이후 함수 호출이 끝나면 해당 스택은 없어진다.

Built-in Scope

print함수의 경우 특별한 함수 선언 없이 바로 사용할 수 있다. 분명 print라는 함수도 객체이다. global scope에서 해당 코드를 실행하면 global scope에서 print객체를 찾기 시작할 것이다.
하지만 print 객체를 생성한적이 없다. 이때 확인하는 범위가 바로 Built-in Scope이다. for, while, range와 같은 객체들이 해당 Scope에 존재한다.

print("Spam")

Enclosing Scope

해당 코드를 실행하면 우선 name = BOK SI YEON 이 할당되고, outer함수가 global scope에 저장된다.

### global scope
name = "BOK SI YEON"
def outer():
    ### enclosed scope
    name = "BOK HYUN SOO"
    print(name)
    def inner():
        ### local scope
        name = "BOK HYE YEON"
        print(name)
    inner()
outer()

outer함수를 호출했으므로 outer함수를 위한 local scope 범위의 스택이 만들어진다.

해당 스택name = BOK HYUN SOO이 할당되고 built-in scope에서 찾은 print함수와, outer스택에 존재하는 name을 출력한다. 그후 또 inner함수라는 객체를 local scope범위에 저장한다.

이 상태에서 inner를 호출하게 되면 local Scope안에 더 작은 scope가 생성되게 된다.
이때 해당 scopelocal scope가 되고, 원래 local Scopeenclosed Scope가 된다.

0개의 댓글