참조 : https://dojang.io/mod/page/view.php?id=2364
전역변수 지역변수
함수를 포함하여 스크립트 전체에서 접근할 수 있는 변수를 전역변수 (global variable)라고 부른다
g_val = 'g_val'
def v1():
global gloval
gloval = 'gloval'
loval = 'local-val'
print()
print(g_val)
print(gloval)
print(loval)
v1()
# g_val
# gloval
# local-val
g_val은 전역변수로 선언되어있는 상태에서 v1이 실행, v1에서 gloval이라는 전역변수가 선언되고,
loval이라는 지역변수가 선언되었음
g_val = 'g_val'
def v1():
global gloval
gloval = 'gloval'
loval = 'local-val'
print()
print(g_val)
print(gloval)
print(loval)
def v2(g_val, gloval):
loval = 'v2 loval'
print()
print(g_val, gloval)
print(loval)
v1()
v2(g_val, gloval)
'''
g_val
gloval
local-val
g_val gloval
'''
v1을 실행한 후, v2를 실행하였다.
g_val에 'g_val'이 담긴 상태에서, v1을 통해 gloval이 전역변수로 선언되었으며, 그렇기에 함수밖에서 v2로 gloval을 파라미터로 넘겨줄 수 있었다.
def argv2(**args):
args['gloval'] = 'ddd'
print()
print(args)
print(args['gloval'])
print(gloval)
'''
{'gloval': 'ddd', 'dfdf': 'fdfd'}
ddd
gloval
'''
args로 받게되면, 딕셔너리로 담기는데, 이 때 여기서 gloval을 변경했을때는 어떨까? 고쳐보았다.
그 결과 args로 담겨진 gloval은 변경해도, 전역변수의 변경이 되지 않는것을 볼 수 있었다.
결국 마지막 print(gloval)
로, gloval을 확인해본 결과, 바뀌지않았다.
그냥 dictionary에서 Key = gloval 의 값이 바뀌어버린것으로만 보면 될것같다.
def v3(g_val, gloval):
g_val = '333 changed'
gloval = '33 changed groval'
print()
print(g_val, gloval)
v1()
v3(g_val, gloval) ## 함수에서 전역변수를 받아서 변경해봄
print()
print(g_val, gloval)
'''
g_val
gloval
local-val
333 changed 33 changed groval
g_val, gloval
'''
v3에서 파라미터로 받은 변수를 변경한다면 어떻게될지 테스트해보았다.
g_val과, gloval을 둘 다 변경시켜서 v3내에서 출력한 결과 바뀌어서 출력된다.
그러나 외부에서 다시 g_val, gloval을 출력해본결과 바뀌지 않았다.
def v4():
global g_val
print(g_val)
g_val = 'v4_gval'
v4()
print(g_val)
'''
g_val
v4_val
'''
이번엔 v4함수를 만들어서 , 그 안에서 global로 g_val을 불러오고나서 변경시켜보았다
잘 변경된다!
이로써 배우게 된 점 ....
전역변수를 설정하는것에 있어서 조심조심히 사용해야할것이며, 그것을 어떠한 함수 내에서 사용하면서 변경할 경우, 왠만하면 직접참조하지않는것이 좋을것같다. 정...변경이 필요하다면 return을 받아서 그걸 밖에서 저장하는 방식이 일관성있게 더 낫지않을까..싶다.
정말 부득이하게 어떠한 함수 내에서 전역변수를 변경하거나, 선언할 일이 생긴다면 global
키워드를 사용해야한다!
'Python' 카테고리의 다른 글
Python Decorator에 대하여 @ 데코레이터 (0) | 2021.06.14 |
---|---|
lambda , filter, map (0) | 2021.05.11 |
Python Generator 제너레이터, yield (0) | 2021.05.11 |
Object-Oriented Programming (0) | 2021.05.11 |