Scope rule
의 핵심은
어떤 객체
를 참조할때 가까운 스택(namespace)
를 참조하는 것이라고 할 수 있는것 같다.
꼭 python
뿐만 아니라 JavaScript
, C
모두 비슷한 스코프룰을 가지고 있다.
규칙을 정리해보면 다음과 같다
특정 문법이 없는 상태에서
=
하는 것은 매우 제한적이다.python
의 경우 모든 것이 객체
로 이루어져 있다.
다음과 같이 name
이라는 변수에 str
을 저장하면 해당 값이 저장된 주소
가 namespace
에 저장된다. 이렇게 전역변수가 저장되는 범위가 Global Scope
이다.
name = "bokjunsoo"
해당 코드를 실행하면 global Scope
에서 namespace
의 name
이라는 변수와 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
이라는 변수가 존재하므로 해당 값을 참조하여 출력한다.
이후 함수 호출이 끝나면 해당 스택
은 없어진다.
print
함수의 경우 특별한 함수 선언 없이 바로 사용할 수 있다. 분명 print
라는 함수도 객체이다. global scope
에서 해당 코드를 실행하면 global scope
에서 print
객체를 찾기 시작할 것이다.
하지만 print
객체를 생성한적이 없다. 이때 확인하는 범위가 바로 Built-in Scope
이다. for, while, range
와 같은 객체들이 해당 Scope
에 존재한다.
print("Spam")
해당 코드를 실행하면 우선 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
가 생성되게 된다.
이때 해당 scope
가 local scope
가 되고, 원래 local Scope
는 enclosed Scope
가 된다.