[Python] 변수의 유효범위 : 전역변수(Global variable) vs. 지역변수(Local variable)
Python 분석과 프로그래밍/Python 프로그래밍 2018. 7. 11. 23:12이번 포스팅에서는 변수의 유효범위(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
|
많은 도움이 되었기를 바랍니다.
'Python 분석과 프로그래밍 > Python 프로그래밍' 카테고리의 다른 글
[Python] 함수 안에 TypeError, ValueError 메시지 지정하기 (0) | 2018.07.14 |
---|---|
[Python] 함수 안의 함수 : 중첩함수(Nested Function), 재귀함수(Recursive Function) (0) | 2018.07.13 |
[Python] 익명 함수 lambda (0) | 2018.07.08 |
[Python] 함수 return 문 : 호출자에게 값 반환 (0) | 2018.07.06 |
[Python] 함수 가변 매개변수 *args, **kwargs (arbitrary arguments) (0) | 2018.06.23 |