본문으로 바로가기

Python 재귀에서의 global 활용

category Python/Python 기타 2021. 9. 22. 16:05

Python 재귀에서의 global 활용

 

재귀에서 global ( 전역 변수 ) 활용 전에 우선 지역 변수와 전역 변수가 무엇인지 말씀드린 뒤, global 이 무엇인지, 이를 어떻게 재귀에서 활용할 수 있는지 말씀드리도록 하겠습니다.

 

지역 변수( local variable )와 전역 변수( global variable )

 

함수안에서 정의되는 변수를 지역 변수 ( e.g. 아래 예시에서 local_var )라 하고 이는 함수 내에서만 존재합니다. 즉 함수 바깥에서 print( local_var ) 와 같이 함수 안에서 정의된 지역 변수 ( local_var )를 불러오면 ' NameError: name 'local_var' is not defined ' 와 같은 에러가 발생하게 됩니다. 

 

이와 반대로 함수 바깥에서 정의되는 함수를 전역 변수 ( e.g. 아래 예시에서 global_var ) 라 하는데, 이는 함수 바깥에서 정의되고 아래 예시와 같이 함수 안에서도 이용할 수 있습니다.

global_var = 3

def test(  ) :
    local_var = 5
    print('local_var + global_var : ', local_var + global_var)
    return local_var + global_var

test( )

## out ## 
local_var + global_var :  8

 

* 함수 안에 전역 변수와 동일한 이름의 지역 변수가 정의된다면 함수 내에서는 지역 변수를 이용하게 됩니다. 아래와 같이 함수 내에서 전역 변수와 이름이 같은 지역 변수가 정의되면 함수 내에서는 지역 변수를 이용합니다.

global_var = 3

def test(  ) :
    global_var= 1 # 전역 변수와 이름이 같은 지역 변수
    local_var = 5
    print('local_var + global_var : ', local_var + global_var)
    return local_var + global_var

test( )

## out ## 
local_var + global_var :  6

 

global

코딩을 하고 있다가 함수 내에 있는 지역 변수를 함수 바깥에서도 부르고 싶은 경우가 있는데, 이때 global 을 이용하면 됩니다. 아래 예시와 같이 전역 변수로 설정하고 싶은 지역 변수 앞에 global 을 통해 선언합니다. global 을 통해 전역 변수가 된 지역 변수는 함수 바깥에서 print( local_var ) 와 같이 호출해도 함수 내의 값이 호출 되게 됩니다.

global_var = 3

def test(  ) :
    global local_var
    local_var = 5
    print('local_var + global_var : ', local_var + global_var)
    return local_var + global_var

test()
## out ##
local_var + global_var :  8


print('local_var : ', local_var)
## out ##
local_var :  5

 

재귀에서의 global 활용

재귀에서 무한으로 재귀하는 것을 막기 위해 termination condition 을 작성해야 합니다. 무한 재귀를 종료하는 것 뿐만 아니라 termination condition 을 만족하는 경우가 발생했을 때 termination condition이 발생했음을 저장하고 싶을 때가 있습니다. ( 별도의 코딩을 하지 않는다면 이는 그저 termination 되는 것 말고 표시가 되지 않습니다. ) 아래 예시와 같이 global 을 이용한다면 termination condition 을 만족하는 경우가 발생했을 때 그 발생을 기록할 수 있습니다.

IsCycle = False # cycle 이 발생하지 않은 것을 기본 값으로 지정
def cycle_check( arcs, stack, edge ) : 
    if edge in stack : # cycle이 발생했다면 
        global IsCycle # IsCycle 을 전역 변수로 설정하고 True 로 설정
        IsCycle = True # IsCycle 값을 True 변경하여 termination condition 발생함을 알림
        return True
    
    stack.append( edge )
    successive_edges = [ arc for arc in arcs if arc[0] == edge[1] ]
    
    for edge in successive_edges : 
        cycle_check( arcs, stack, edge )
    stack.pop()
    
    return IsCycle
    
t = [ (1,2), (1,5), (2,3), (3,1) ]
cycle_check( t, [], (3,1) )
## out ##
True