어떤 변수, 함수나 객체 등이 적용될 수 있는 범위
범위를 벗어나면 해당 객체는 사용 X
Python에서 Scope 는 항상 객체가 선언된 지점에서
위로는 해당 변수나 객체가 생성된 지점에서 상위 객체까지,
아래로는 모든 하위 객체들과 그 내부까지가 범위

def local_scope():
local var = 1
print(local_var)
print(local_var) # local_var는 함수 내에서만 호출 가능하므로, 호출이 불가하다.

def enclosing_scope():
enclosing_var = 2
def inner_func():
inner_var = 3
print(enclosing_var * inner_var) # 6이 나옴
inner_func()
print(inner_var)
enclosing_var이 외부함수에서 정의되었지만, 내부함수에서까지 사용
주로 중첩함수가 정의되어 있을 때 사용되는 scope의 개념
부모 함수에서 선언된 변수는 중첩 함수 안에서도 유효한 범위를 가짐
외부 함수에서 선언된 변수나 함수는 내부 함수에까지 영향을 줌

global_var = 10
def outer_func():
outer_var = global_var + 3
print(outer_var) # 13 출력
def inner_func():
inner_var = global_var * 10
print(inner_var) # 100이 출력
print(global_var) # 10이 출력
함수 안에서 선언된 것이 아닌 함수 밖에서 선언된 변수나 함수
선언된 지점과 동일한 level의 지역, 그리고 더 안쪽의 지역들까지 범위가 유효
(선언된 지점에 대한 동일 지역 및 그 하위까지 모두 접근이 가능)
global scope를 가지고 있는 변수와 함수는 선언된 지점이 해당 파일에서 가장 바깥쪽에 선언되므로,
해당 파일에서 선언된 지점 아래로는 다 유효한 범위를 갖는다.

가장 광범위한 Scope
파이썬 안에 내장되어 있는, 파이썬이 제공하는 함수 또는 속성들이 built-in scope를 가짐
built-in scope는 따로 선언없이 모든 파이썬 파일에서 유효한 범위를 갖음
별다른 선언없이 실행되는 len(), input(), print()와 같은 python 내장 함수
test_var = 10
def func1():
test_var = 12
print(test_var)
def func2():
test_var = 100
print(test_var)
print(test_var)
> # 10
> # func1 test: 12
> # func2 test: 100 라고 출력이 됨
변수나 함수의 정의를 찾는 Scope`순서 ::
Local scope -> Enclosing scope -> Global Scope -> Built-in Scope
가장 좁은 유효범위부터 시작해서 넓은 범위로 나아가며 사용되는 변수나 함수의 정의를 찾음
선언된 변수나 함수의 정의를 찾을 때,
선언된 지점을 기준으로 가장 가까운 범위부터 찾고, 가장 가까운 범위에 있는 정의를 가장 우선
동일한 이름의 변수들이 서로 다른 scope에서 선언되면 더 좁은 범위에 있는 변수나 함수가 더 넓은 범위에 있는 변수나 함수를 가리는 Shadowing 효과가 나타남
