파이썬 지역변수와 전역변수

gimmicks_u·2022년 5월 4일
0

파이썬

목록 보기
1/1
post-thumbnail

Case1

Case1-1

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변수가 선언되지 않았기 때문에 전역변수를 출력해주는 것을 확인할 수 있다.

Case1-2

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가 출력된다.

Case1-3

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가 없기 때문에 오류를 출력하게 된다.

Case1-4

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을 이용한다. 이는 함수 내에서 해당 변수를 데이터 메모리 영역에 있는 전역변수의 메모리를 가르키겠다는 뜻으로, 함수내에서 해당 변수를 수정할 경우 전역변수가 수정됨을 인지해야 한다.

Case2(추가 예제)

Case2-1

def DFS():
    a[0] = 7
    print("In DFS :", a)
    
a = [1, 2, 3]
DFS()
print("바깥 :", a)
In DFS : [7, 2, 3]
바깥 : [7, 2, 3]

Case2-2

def DFS():
    a = [7, 8] 
    print("In DFS :", a)
    
a = [1, 2, 3]
DFS()
print("바깥 :", a)
In DFS : [7, 8]
바깥 : [1, 2, 3]

Case2-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

Case2-4

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

profile
Done is better than perfect

0개의 댓글