[TIL] Python 지역변수, 전역변수

dev.soo·2020년 10월 4일
0

Python

목록 보기
6/6

지난 프로젝트에서 Wishlist 함수를 만들고 다른 파일에서 import 해서 사용하였다. 이 때 값을 False 로 default 설정 해 두었는데, 변수의 범위 설정에 따라 값이 다르게 나오곤 했다. 그래서 이번에는 지역번수와 전역변수에 대해 공부해보고자 한다.

해당 함수에서, global + 변수명 을 사용하여 해당 변수를 전역변수로 설정해 주었다.

global 사용은 피하는 것이 좋다고 했던 것 같아서 프로젝트 종료 이후 global 을 사용하지 않는 방식으로 다시 코드를 짜보려고 했다.
그런 경우, is_wishlist() 함수를 사용하는 app 의 views 에서, 그것도 class 내의 각각의 함수에서 is_wishlist = False 라고 선언해 주어야 한다는 단점이 있다. 어떤 기능을 수행하는 함수를 작성할 때 위시리스트 여부를 확인하는 함수를 반복적으로 작성하는 것을 피하고자 utils.py 에 따로 함수를 선언하였는데, 이 함수를 사용하는 다른 함수에서 변수를 선언해주는 함수가 한 줄 추가되게 된다. 그래서 그냥 global을 사용하기로 하였다.

사실 함수를 작성할 때, 계속 함수를 실행시키면서 제대로 작동할 때 까지 변수를 여기 저기서 선언했었다. 그래서 global 을 어디에서 선언하고 어떻게 사용하면 되는지 정리해 보았다.

  1. 함수 안에서 선언하기

함수 내부에서 global을 통해 a를 전역 변수로 선언해주어서, 함수 밖에서 print(a) 처럼 변수를 사용할 수 있게 되었다. global a 가 없었다면, 마지막 코드에서 NameError 가 나게 된다.

def test():
    global a
    a = 3
    b = 2
 
    return a + b
 
print(test())
print(a)

2. 함수 밖에서 선언하기

함수 밖에서 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)효과가 나타납니다.

0개의 댓글