Algorism/Python

global & nonlocal

aoaa 2022. 4. 3. 20:56

https://programmers.co.kr/learn/courses/30/lessons/43165

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수

programmers.co.kr

 

 

def solution(numbers, target):
    n = len(numbers)
    answer = 0
    def dfs(idx, result):
        if idx == n:
            if result == target:
                nonlocal answer
                answer += 1
            return
        else:
            dfs(idx+1, result+numbers[idx])
            dfs(idx+1, result-numbers[idx])
    dfs(0,0)
    return answer

프로그래머스의 타겟넘버라는 문제에서 나온 부분입니다.

첫 def solution에서 정의된 answer를 아래 def dfs 함수까지 값을 가지고 오고 싶어, global answer라는 변수를 사용했었는데 syntax error : return outside function이 떠버려서 문제점을 찾아보았습니다.

def solution(numbers, target):
    n = len(numbers)
    answer = 0
    def DFS(L, result):
        if L==n:
            if result==target:
                global answer
                answer+=1
            return
        else:
            DFS(L+1, result+numbers[L])
            DFS(L+1, result-numbers[L])

DFS(0, 0)
return answer

 return outside function은 return이 함수 내에서 함수에 따른 결과값을 반환시키지 못해 일어난 것입니다.

global 명령어는 지역변수가 전역변수에 영향을 줄 수 있도록하는 명령어입니다. global 은 함수 내의 함수로 몇차례 연속으로 들어가건, global이 사용된 함수의 지역변수를 연결시킵니다. 그런데 위의 코드 같은 경우는 전역변수인 함수를 지정하지 않았기 때문에 error가 발생했습니다.

 여기서 nonlocal을 사용하면 지역변수가 아님을 선언하고 사용된 함수 바로 한단계 바깥에 위치한 변수와 binding 할 수 있습니다. 

 

x = 20 # 전역변수 (global variable)

def f():
    x = 40
    
    def g():
        nonlocal x
        x = 80
        
    g()  # 함수 g를 실행하여 nonlocal이 적용되도록 한다.
    print(x)  # 함수 f에서의 x값이 출력된다.(함수 g에서 nonlocal 의 영향을 받아 변수가 80으로 변경되었다.)
f()
print(x)  # 모든 함수 실행이 끝나고, 변수 x를 출력한다.(출력값은 처음값인 20이다)

 위 코드는 바로 위에 해당하는 f함수의 지역변수에만 영향을 주고 지역변수에는 영향을 주지 않았습니다.

x = 70  # 전역변수 (global variable)

def f():
    nonlocal x
    x= 140
    
f()
print(x)

그러므로 nonlocal은 함수 한개를 정의하고 전역변수에 영향을 주게 된다면 -> no bingding for nonlocal 'x' found라는 error가 발생합니다.

'Algorism > Python' 카테고리의 다른 글

그리디 알고리즘 1  (0) 2022.03.17
결정알고리즘 2  (0) 2022.03.16
결정알고리즘 1  (0) 2022.03.15
이분탐색  (0) 2022.03.14
사과나무(다이아몬드)  (0) 2022.03.14