이번 포스팅에서는 변수의 유효범위(scope of variables)에 대해서 알아보겠습니다. 


파이썬은 변수의 유효범위에 따라 


(1) 프로그램 전체에서 유효한 전역변수(Global Variable)

(2) 함수의 코드블록 안에서만 유효한 지역변수(Local Variable)


의 두가지 종류가 있습니다. 


변수의 유효범위에 대해서 정확하게 이해하지 못하면 Name Error, Unbound Local Error 등과 같은 의도치 않은 에러를 유발할 수 있으므로 주의가 필요합니다. 


[ Python Variable Scope : Global Variable vs. Local Variable ]




간단한 예를 들어서 설명해보겠습니다. 


  전역변수(Global Variable) vs. 지역변수(Local Variable)


아래의 [1]번 행에서 var_scope() 함수를 정의하면서 s = "Python is easy" 라는 지역변수(Local variable)을 정의하였습니다. 이 지역변수는 var_scope() 함수가 호출될 경우에만 함수가 실행이 되면서 메모리에 생성이 되었다가 함수 실행이 끝나면 메모리에서도 사라져버립니다. 


반면에 [2]번 행에서 s = "Python is not easy" 라고 할당한 문자열은 전역변수(Global variable)로서 바로 메모리에 저장이 되며, 프로그램을 전체에서 유효하며, 프로그램이 살아있는 한 계속 같이 살아있으면서 이용이 가능합니다. [4]번 행에서 print(s)를 했을 때 전역변수인 s = "Python is not easy"가 출력이 되었으며, var_scope() 함수 안에서만 유효한 지역변수인 s="Python is easy"는 출력이 안되었습니다. 



In [1]: def var_scope():

   ...:     s = "Python is easy" # Local variable

   ...:     print(s)


In [2]: s = "Python is not easy" # Global variable


In [3]: var_scope() # Local variable

Python is easy


In [4]: print(s) # Global variable

Python is not easy

 




  지역변수가 할당되기 전에 호출하려 할 때 발생하는 Unbound Local Error


아래의 [5]번 행에서 정의한 var_scope() 함수의 코드블록을 보면, 지역변수 's'가 할당이 아직 안된 상태에서 빨간색의 print(s) 를 실행하도록 했더니 "Unbound Local Error: local variable: local variable 's' referenced before assignment' 라는 에러 메시지가 떴습니다. 



In [5]: def var_scope():

   ...:     print(s) # Unbound Local Error

   ...:     s = "Python is easy" # local variable

   ...:     print(s); # local variable


In [6]: s = "Python is not easy"


In [7]: var_scope()

Traceback (most recent call last):


File "<ipython-input-7-51074fe12940>", line 1, in <module>

var_scope()


File "<ipython-input-5-5b8d90c83375>", line 2, in var_scope

print(s) # UnboundLocalError


UnboundLocalError: local variable 's' referenced before assignment

 




  함수 안에서 전역변수를 사용할 수 있게 해주는 global keyword


위의 UnblundLocalError 를 해결하려면 아래의 [8]번행에서 함수를 정의할 때 밑줄 그은 'global s' 처럼 global keyword 를 사용해서 전역변수를 사용하겠다고 선언을 해주면 됩니다. 그러면 [9]번 행에서 전역변수로 할당한 s = "Python is not easy"를 var_scope() 함수의 코드블록 안에서 지역변수가 선언되기 전에도 전역변수를 가져다가 함수 호출 시 이용할 수 있습니다. 



In [8]: def var_scope():

   ...:     global s # global variable

   ...:     print(s)

   ...:     s = "Python is easy" # local variable

   ...:     print(s);


In [9]: s = "Python is not easy"


In [10]: var_scope()

Python is not easy     <--- global variable 's'

Python is easy           <--- local variable 's'

 




  지역변수를 함수 밖에서 호출할 때 발생하는 Name Error


함수의 코드블록 안에서 정의된 지역변수는 함수의 밖에서 사용할 수 없습니다. 만약 함수 밖에서 함수안의 지역변수를 호출하려고 하면 "Name Error: name 's2' is not defined' 라는 에러 메시지가 발생합니다. 프로그래밍을 처음하는 분의 경우 지역변수, 전역변수의 변수의 유효범위 개념을 모를 경우 이게 왜 에러가 발생하는가 하고 의아해 할 수 있습니다. 



In [11]: def var_scope2():

    ...:     s2 = "I love Python"

    ...:     print(s2);


In [12]: print(s2) # NameError: name 's2' is not defined

Traceback (most recent call last):


File "<ipython-input-12-ccb37084217a>", line 1, in <module>

print(s2) # NameError: name 's2' is not defined


NameError: name 's2' is not defined

 


많은 도움이 되었기를 바랍니다. 


Posted by R Friend R_Friend