Python scope

박상영·2020년 5월 28일
0

scope의 종류에는 크게 4가지 가 존재한다.

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 이상의 정수 값을 주게된다.
profile
backend

0개의 댓글