서론
파이썬에서 전역변수를 사용할 때 유의할 점을 봐본다.
전역 변수
아래와 같은 코드가 있다고 봐보자.
test_list와 test_number은 전역변수이다.
그러나 test_func안에 test_number이라는 같은 변수명으로 선언되어 있다.
이 경우, 함수 내에서는 지역변수를 우선순위로 보고 함수내의 print문에서 10이라는 값을 출력한다.
하지만 함수 밖의 if문 아래에서의 print를 보면 전역변수의 값인 100이 출력된다.
import random
test_list = []
test_number = 100
def test_func() :
rand_value = random.randint(0, 10)
test_list.append(rand_value)
test_number = 10
print(f"test_list:{test_list} & test_flag: {test_number}")
if __name__=='__main__' :
test_func()
print(f"test_flag from out func: {test_number}")
결과:
test_list:[2] & test_flag: 10
main: 100
따라서 전역변수를 사용하고자 할때는 global이라는 키워드를 명시해서 변수를 변경해야한다.
global test_number 이라는 키워드를 줌으로써 우리는 함수내에서 전역변수를 사용하겠다라는 의미가 형성된다. 따라서 함수의 출력결과가 전역변수와 같은 값인 100이 나오는 것을 알 수 있다.
import random
test_list = []
test_number = 100
def test_func() :
rand_value = random.randint(0, 10)
test_list.append(rand_value)
global test_number
print(f"test_list:{test_list} & test_flag: {test_number}")
if __name__=='__main__' :
test_func()
print(f"main: {test_number}")
결과:
test_list:[8] & test_flag: 100
main: 100
그럼 리스트 객체로 구성된 변수는 따로 global을 명시할 필요가 없을까?
결론은 리스트의 경우 global키워드를 사용할 필요가 없다.
global이라는 키워드 의미는 전역변수로 되어있는 변수를 함수 내에서 사용할게 라는 의미를 갖는다.
그리고 변수의 값을 변경할 수 있다.
하지만 리스트 객체를 담고 있는 변수는 우리가 리스트라는 객체를 변경하는 것이 아니다.
단순히 리스트에 추가하고 삭제하는 것 뿐이지 리스트라는 객체를 다른 객체로 변경하는 것이 아님으로 global키워드 없이 사용이 가능하다.
아래 코드는 함수내에서 test_list안에 값을 추가하였지만 함수 밖의 if문에서도 똑같은 결과값이 나오는 것을 볼 수 있다.
import random
test_list = []
test_number = 100
def test_func() :
rand_value = random.randint(0, 10)
test_list.append(rand_value)
global test_number
print(f"test_list:{test_list} & test_flag: {test_number}")
if __name__=='__main__' :
test_func()
print(f"main: {test_number}, {test_list}")
결과:
test_list:[4] & test_flag: 100
main: 100, [4]
Comment