✍ 전역변수와 지역변수
0.
메인스크립트에 선언되면 전역변수
def DFS1(): # ✨ def 1
print(cnt)
def DFS2(): # ✨ def 2
if cnt == 5:
print(cnt)
if __name__ == '__main__':
cnt=5 # ✨ 1
DFS1() # ✨ def 1
DFS2() # ✨ def 2
print(cnt)
1 : 전역변수
이 한 줄에 담긴 의미 : cnt라는 변수가 생성되고 5라는 값이 할당됨. 변수의 생성과 값 할당까지 다 가지고 있다.
기본적으로 전역변수는 모든 함수가 접근할 수 있고 값도 변경할 수 있는 공용의 값이다.
이 전역변수가 읽힌 다음 전역변수 안에 있는 함수 DFS1()과 DFS2()를 읽어내려가게 되는데
def 1 : 함수
1. cnt라는 변수가 자신의 지역변수인지 먼저 확인해본다.
=> 자신의 공간에 cnt가 있는지 확인해본다.
2-1.지역변수이면 자신의 지역변수로 인식하고 작동한다
2-2. 그러나 자신의 지역변수 공간에 cnt가 존재하지 않는다면 전역변수인지를 확인한다.
만약 전역변수도 아니라면 에러가 발생. not defined!
def 2 : 함수
이 또한 지역변수인지 확인해보고 아니면 전역변수를 확인한 다음에 print(cnt)를 출력한다
1.
def DFS1(): # ✨ def 1
cnt = 3
print(cnt)
*
만약 def 안에 cnt = 3 등의 값을 넣어주면
함수 안에 지역변수가 생긴 것.
따라서 전역변수 cnt = 5를 출력하는 것이 아니라
cnt = 3이 우선하여 print()로 3을 출력하게 된다
=> 같은 변수명을 가지고 있는 전역변수와 지역변수가 있다면 지역변수가 우선한다.
2.
def DFS2(): # ✨ def 2
if cnt == 5:
cnt = cnt+1
print(cnt)
*
만약 def2 안 if 밑에 cnt = cnt+1이 들어가게 된다면?
cnt = 이 들어갔기 때문에 새로운 지역변수가 생겼다고 볼 수 있다
이 cnt라는 새로운 지역변수 안에 cnt + 1 을 만들었다고 볼 수 있다.
=> cnt는 def2의 지역변수가 된다
그러나
if cnt == 5에서 cnt를 찾지 못하기 때문에(지역변수는 존재하지만 선언되기 전에 불러왔기 때문에) 오류가 발생한다.
local variable 'cnt' referenced before assignment
이 때 cnt를 전역변수로 사용하기 위해서는
global 이 필요하다
def DFS2():
global cnt
if cnt == 5:
cnt = cnt+1
print(cnt)
언어번역이 되기 전에 전역변수라고 알려주는 것
global 후에는 cnt가 지역변수라고 판별되는 것이 아닌
전역변수인 cnt의 값에서 1을 더한 값으로 전역변수 cnt를 변화시킨다.
=> global '전역변수명' 을 사용하게 되면 지역변수와 헷갈리지 않고 변수를 전역변수로 판별한다