지난 프로젝트에서 Wishlist 함수를 만들고 다른 파일에서 import 해서 사용하였다. 이 때 값을 False 로 default 설정 해 두었는데, 변수의 범위 설정에 따라 값이 다르게 나오곤 했다. 그래서 이번에는 지역번수와 전역변수에 대해 공부해보고자 한다.
해당 함수에서, global
+ 변수명 을 사용하여 해당 변수를 전역변수로 설정해 주었다.
global
사용은 피하는 것이 좋다고 했던 것 같아서 프로젝트 종료 이후 global
을 사용하지 않는 방식으로 다시 코드를 짜보려고 했다.
그런 경우, is_wishlist()
함수를 사용하는 app 의 views 에서, 그것도 class 내의 각각의 함수에서 is_wishlist = False
라고 선언해 주어야 한다는 단점이 있다. 어떤 기능을 수행하는 함수를 작성할 때 위시리스트 여부를 확인하는 함수를 반복적으로 작성하는 것을 피하고자 utils.py 에 따로 함수를 선언하였는데, 이 함수를 사용하는 다른 함수에서 변수를 선언해주는 함수가 한 줄 추가되게 된다. 그래서 그냥 global
을 사용하기로 하였다.
사실 함수를 작성할 때, 계속 함수를 실행시키면서 제대로 작동할 때 까지 변수를 여기 저기서 선언했었다. 그래서 global
을 어디에서 선언하고 어떻게 사용하면 되는지 정리해 보았다.
함수 내부에서 global
을 통해 a를 전역 변수로 선언해주어서, 함수 밖에서 print(a)
처럼 변수를 사용할 수 있게 되었다. global a
가 없었다면, 마지막 코드에서 NameError 가 나게 된다.
def test():
global a
a = 3
b = 2
return a + b
print(test())
print(a)
함수 밖에서 global 을 사용하여 전역변수로 설정한 경우, 함수 내부에서 해당 변수를 사용하기 위해서는 함수 내부에서 사용을 명시해 주어야 한다. 아래 함수 내부에서 global a
가 있게되면서, 그 아랫줄의 a=3
이 전역 변수 a 에 적용되어 print(a)
의 결과가 5가 된다.
global a
a = 1
def test():
global a
a = 3
b = 2
return a + b
print(test())
print(a)
내가 함수를 작성하면서 겪었던 어려움은, Shadowing 효과였다.
Local => Enclosing => Global => Built-in
파이썬은 변수나 함수의 정의를 찾을때 위의 순서의 scope들 안에서 찾는다.
즉 가장 좁은 유효범위 부터 시작 해서 넓은 범위로 나아가며 사용되는 변수나 함수의 정의를 찾는다. 그러므로 만일 동일한 이름의 변수들이 서로 다른 scope에서 선언이 되면 더 좁은 범위에 있는 변수(혹은 함수)가 더 넓은 범위에 있는 변수를 가리는 (shadowing)효과가 나타납니다.