def DFS1():
print("In DFS1 :", cnt)
def DFS2():
if cnt == 5:
print("In DFS2 :", cnt)
cnt = 5
DFS1()
DFS2()
print("바깥 :", cnt)
In DFS1 : 5
In DFS2 : 5
바깥 : 5
함수 안에서 변수가 호출되게 되면 컴퓨터는 지역변수(스택 메모리)
를 먼저 찾고, 없으면 전역변수(데이터 메모리)
를 찾게된다. DFS1,2
함수에는 cnt
변수가 선언되지 않았기 때문에 전역변수를 출력해주는 것을 확인할 수 있다.
def DFS1():
cnt = 3
print("In DFS1 :", cnt)
def DFS2():
if cnt == 5:
print("In DFS2 :", cnt)
cnt = 5
DFS1()
DFS2()
print("바깥 :", cnt)
In DFS1 : 3
In DFS2 : 5
바깥 : 5
DFS1()
함수에 cnt
지역변수가 선언되어 스택메모리에 쌓이고 cnt
변수를 출력했을 때 지역변수가 호출되어 3이 출력된다. DFS1()
함수 호출이 종료되는 순간 스택 메모리에 저장된 지역변수 cnt
는 삭제되고, DFS2()
에서는 전역변수 cnt
가 출력된다.
def DFS1():
cnt = 3
print("In DFS1 :", cnt)
def DFS2():
if cnt == 5: # << the error occurs here
cnt = cnt + 1
print("In DFS2 :", cnt)
cnt = 5
DFS1()
DFS2()
print("바깥 :", cnt)
.
.
.
UnboundLocalError: local variable 'cnt' referenced before assignment
DFS2()
함수가 먼저 기계어로 번역될 때 함수 안의cnt
가 지역변수로 먼저 번역이 된 후 DFS2()
함수가 호출된다. 함수가 실행될 때 에러가 발생하는 라인에서 cnt
는 지역변수를 참조해야 하지만, 선언된 지역변수cnt
가 없기 때문에 오류를 출력하게 된다.
def DFS1():
cnt = 3
print("In DFS1 :", cnt)
def DFS2():
global cnt
if cnt == 5:
cnt = cnt + 1
print("In DFS2 :", cnt)
cnt = 5
DFS1()
DFS2()
print("바깥 :", cnt)
In DFS1 : 3
In DFS2 : 6
바깥 : 6
이를 해결하기 위해 전역변수를 함수 내에서 사용할 수 있도록 global
을 이용한다. 이는 함수 내에서 해당 변수를 데이터 메모리 영역에 있는 전역변수의 메모리를 가르키겠다는 뜻으로, 함수내에서 해당 변수를 수정할 경우 전역변수가 수정됨을 인지해야 한다.
def DFS():
a[0] = 7
print("In DFS :", a)
a = [1, 2, 3]
DFS()
print("바깥 :", a)
In DFS : [7, 2, 3]
바깥 : [7, 2, 3]
def DFS():
a = [7, 8]
print("In DFS :", a)
a = [1, 2, 3]
DFS()
print("바깥 :", a)
In DFS : [7, 8]
바깥 : [1, 2, 3]
def DFS():
a = a + [4] # the error occurs here
print("In DFS :", a)
a = [1, 2, 3]
DFS()
print("바깥 :", a)
.
.
.
UnboundLocalError: local variable 'a' referenced before assignment
def DFS():
global a
a = a + [4]
print("In DFS :", a)
a = [1, 2, 3]
DFS()
print("바깥 :", a)
In DFS : [1, 2, 3, 4]
바깥 : [1, 2, 3, 4]
출처 : 인프런 파이썬 알고리즘 강의 https://inf.run/MJQ5