수학과의 좌충우돌 프로그래밍

Scoping , LEGB 룰 본문

프로그래밍 언어/Python

Scoping , LEGB 룰

ssung.k 2018. 12. 1. 16:27



안녕하세요 강민성입니다.


오늘은 파이썬 변수의 유효 범위에 대해서 알아보도록 하겠습니다.


먼저 scoping rule 이란


변수의 접근이 가능한 범위를 뜻합니다.


이 scope를 결정하는 방식에는 크게 두 가지로 나눌 수 있는데


static scoping dynamic scoping 입니다.


그 중에서 dynamic scoping 에 대해서 알아보도록 하겠습니다.


dynamiic scoping를 사용하는 대표적인 예가 바로 python 이죠.


그래서 python 언어를 통해 알아보겠습니다.



파이썬에서 변수는 4가지 경우가 존재합니다.


LEGB 가 각각에 해당되는데 이에 대해서 먼저 알아보도록 하겠습니다.



      Local   :   함수 내부의 공간


   Enclosing Function Local   :  함수를 내포하는 또 다른 함수의 공간


    Global   :   함수 외부의 공간


                                                                       Built-in   :   내장영역




파이썬에서는 변수를 호출 할 때 찾는 위치가


 다음과 같은 순서로 호출을 하게 됩니다.


local 을 확인해보고 없으면 그 다음 영역을,


또 없으면 그 다음 영역을 찾는 방식으로 말이죠.



이제 아래 예시를 통해 살펴보겠습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
= 10
= 20
def outer():
    x = 11
    def inner():
        z = 30
        print(x,y,z)
    inner()
    x = 40
    inner()
    
outer()
# 11 20 30
# 40 20 30
cs




 첫 번째 inner 가 호출 될 때 부터 보겠습니다.


함수 내부에서 변수를 선언하면 자동으로 local 변수가 됩니다.


 따라서 inner 의 입장에서는 선언된 local 변수는 z 하나 뿐입니다.


x는 local 변수로 선언이 안되있으므로


E 영역의 변수를 찾습니다.


여기서 x = 11 로 선언이 되있으므로 11을 출력하게 됩니다.


y 도 같은 방식으로 찾아보면


l 영역에 없고, E 영역에 없고  G영역, 즉 함수 바깥에 위치하고 있습니다.


따라서 20을 출력하게 됩니다.


z는 inner 함수 안인 l 영역에 선언이 되있으므로 바로 30을 출력하게 되죠.




두 번째 inner 에 대해서는 결과값은 알려드렸으니


어떻게 다음과 같이 출력되는지는 여러분께 과제로 남겨드리겠습니다.







다음 예시 입니다.

1
2
3
4
5
6
7
8
9
10
= 10
 
def test(y):
    x = y + 10
    
= 10
test(y)
 
print(x) # 10
    
cs



다음과 같이 x 값에 10을 더해주는 함수를  만들고 싶었지만


결과는 원래는 x값이 출력되고 맙니다.


x가 출력되는 시점에서 맨 위에 선언된 


local 변수 x를 참조하기 때문이죠.


이 때 test 함수 내에서 x를 global 변수로 만들어 줄 수 있습니다.



1
2
3
4
5
6
7
8
9
10
11
= 10
 
def test(y):
    global x
    x = y + 10
    
= 10
test(y)
 
print(x) # 20
    
cs


다음과 같이


 global 변수이름


형태로 변수를 선언하게 되면 함수 내에 있지만 local 변수가 아닌


global 변수가 되서 원하는 결과 값이 나오는 걸 확인할 수 있습니다.






마무리


코드가 길어질 수록 함수가 많아지고 복잡 해질수록 


변수의 접근가능 범위를 찾는게 어려워 질 것입니다.


지금 제시한 예제들은 쉬운 예시들이지만 


여러 코드를 보며 반복숙달해서 


성장하시기를 바랍니다.


오늘도 글을 읽어주셔서 감사합니다 :)

Comments