Local Scope (범위가 가장 제한적)
Enclosed Scope
Global Scope
Built-in Scope ( 범위가 가장 광범위)
먼저 Local Scope 먼저 알아보겠다.
Local Scope 를 가지고있는 변수나 함수 혹은 객체는 이름 그대로 특정 범위에서만 유요하다.
local_scope 함수 내에 local_var, x 인 변수에 값을 저장하고 print로 출력해보았다.
local_scope() #함수 호출
This is Local_var
300
local_scope 함수를 호출했을때 변수의 값들이 제대로 출력되는것을 볼수있다. 하지만 범위가 함수내에서만 한정되기 때문에
x = 600
def local_scope():
local_var = "This is Local_var"
x = 300
print(local_var)
print(x)
local_scope() # 함수호출
This is Local_var
300
위에 함수 범위 밖에서 x의 변수에 600 의 값을 주었지만, 출력의 값을 봤을때 함수 내에서 변수 x 의 값이 나오게 된다. 하지만 함수밖에서
print(x)
600
따로 변수x를 출력했을땐 주었던600의 값이 나왔다.
local_scope 는 함수밖에서 선언된 변수 값을 다시 함수 내에서 지정하게 되면 밖에서 저장했던 변수와 다른 변수가 되어 다른 값이 저장이된다.
하지만 밖에서 변수를 저장하고 내부에서 단순히 그 변수를 사용만하고 따로 값을 지정해주지 않는다면, 사용할수는 있다. 또한
x = 600
def local_scope():
print(x)
x = 300
print(x)
local_scope():
밖에서 변수에 입력하고 나서 local_scope 함수 내에 먼저x를 출력하고 x에 다시 값을 입력시켜서 x를 출력하게 하면 제대로 output이 나오는지 본다면,
LocalError 가 뜬다. 즉 함수내에서는 x가 또한번 값이 주어지기 때문에 x=300 우의 print(x) 는 600이라는 값이 아닌 300의 값이 주어져야 하지만, 주어지기전에 print로 출력하려 했기때문에 Error가 나는것을 볼수있다.
Enclosing Scope 는 중첩함수가 있을때 적용되는 scope 입니다. 부모 함수에서 선언된 변수는 중첩함수 안에서도 유효한 범위를 가지고 있습니다.
def outer(*args, **kwargs):
name = "박상영"
age = 25
address = "seoul"
def inner():
mobile = "010-4919-3208"
return f"""이름은 {name} 나이:{age} 사는곳{address} 핸드폰번호: {mobile}"""
return inner
@outer
def myself():
return
myself() #함수 호출
outer 함수 안에 inner 함수를 중첩시켰다. 물론 outer 함수와 inner 함수내에 각각 변수에 값을 저장했다.
outer함수의 변수가 inner 함수의 return 에 알맞게 잘 들어갔다.
이렇게 중첩함수에서 outer(부모함수)에서 선언된 변수가 inner함수에서도 제대로 값이 전달되는것을 알수있다. 이 Scope가 Enclosing Scope라 할수있다.
Global Scope는 함수 안에서 선언된 것이 아닌 함수 밖에서 선언된 변수나 함수를 이야기 한다.
위에서 설명한 local scope 의 내용안에 포함이 되어있지만 한번 더 알아보자면
a = [x for x in range(1, 30) if x % 3 == 0] #1부터 29까지 3의 배수만 a 변수에 저장
def numbers(): # 함수 선언
print(a)
number() #함수 호출
[3, 6, 9, 12, 15, 18, 21, 24, 27] #호출하여 출력된 값
함수를 선언 하기전에 a의 변수에 숫자들을 저장하하고 나서 numbers 함수를 선언하여 a를 출력하게 했더니 제대로 출력이된다.
밖에서의 변수가 함수 내에서 출력하게 만드는것이 Global scope라 할수있다.
Built-in Scope는 scope중에 가장 광범위 하다.
파이썬 안에 내장되어있는, 파이썬이 제공하는 함수 또는 속성들이 built-in scope를 가지고있다.
List 등과 같은 자료구조(element) 총 개를 return 하는 len 함수가 built-in scope를 가지고 있다.
my_list = [1, 2, 3, 4, 5, 6]
len(my_list) == 6
len()은 __len__을 호출하여 작동한다. 즉 자신만의 함수가 이미 존재한다.
class ClassWithLen:
def __init__(self, *items):
self.storage = list(items)
def __len__(self):
return len(self.storage)
object_list = ClassWithLen(1, 2, 3, 4)
len(object_list) == 4
하지만 len() 이 object_list.__len__ 과 같다고 생각하면 안된다.
Python이 제공하는 len 함수는 class instance 의 __len__ method 가 만들어져 있는지 부터 체크하고, 그 return 유형과 값이 알맞는지 까지 검사해서 최종적으로 0 이상의 정수 값을 주게된다.