[Python] 전역 변수 사용시 주의할 점 / global
오늘 Python에게 한번 더 당해버림
[문제 상황]
1. Flask 서버가 떠있는 상황
2. 스크립트내에서 특정 API 호출 -> 전역변수로 선언되어있는 dictionary에 값을 넣어줌
3. Flask 서버에 있는 스크립트를 호출하면 계속 이전에 호출했던 값과 달라지지 않는 문제
4. But 로컬로 돌리면 잘 됨. 서버에 있는것도 한번 배포를 하면 잘 되고 그 이후부터는 또 똑같은 응답줌
처음에는 API가 캐싱해서 주나.. 라고 의심했는데, 로컬에서는 잘되고 왜 서버에 떠있는것만 문제일까 끙끙대다가
동료분의 도움을 받아서 원인을 찾을 수 있었다 (감사합니다 🙇♀️)
[원인]
my_dict = {}
def test():
my_dict["Zedd"] = "Hello"
def 매번불리는함수():
test()
대충 이런코드
로컬에 있는건 매번 스크립트를 새로 실행하니까 my_dict이 매 실행시 마다 빈 값으로 초기화되지만
서버에 있는건 계속 떠있으니까 전역변수인 my_dict이 처음에만 초기화되고.. 로컬처럼 스크립트 실행시마다 초기화되지 않는것이다.
너무나도 당연한 소리같이 느껴지지만 이 부분 생각을 못했다 ㅋ~~!!!!!!! 전 보초니까요
[해결]
처음에는
my_dict = {}
def test():
my_dict["Zedd"] = "Hello"
def 매번불리는함수():
my_dict = {} # ✅ 초기화 한번 해주기
test()
응 test()호출전에 my_dict을 한번 초기화시켜주면 그만이야~ 라고 생각했는데
my_dict을 print해보니 {} 이렇게 빈값이 나오는것이다.
찾아보니 global 키워드를 사용하면 된단다.
Pyton에서 함수 내부에서 전역 변수를 사용하기 위해서는 global 키워드를 사용하여 해당 전역 변수를 재선언해야 한다고 한다. 그렇지 않으면 지역변수로 취급한다!
my_dict = {}
def test():
my_dict["Zedd"] = "Hello" # 지역변수
def 매번불리는함수():
my_dict = {} # ✅ 초기화 한번 해주기
test()
위 코드에서 test()내의 my_dict은 전역변수가 아닌 my_dict이라는 지역변수가 새로 하나 생긴것
내가
my_dict = {} # ✅ 초기화 한번 해주기
이렇게 해준것도 전역변수인 my_dict을 초기화한게 아니라 그냥 새로운 지역변수를 선언한것이다 ㅎ
global 키워드를 사용하여 수정해보자
my_dict = {}
def test():
global my_dict
my_dict["Zedd"] = "Hello"
def 매번불리는함수():
global my_dict
my_dict = {}
test()
이렇게 해주면 된다!
[참고]
http://www.tcpschool.com/python2018/python_function_scope