티스토리 뷰

반응형

 

오늘 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

 

반응형