https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스 '타겟넘버' 문제를 풀며, 제목과 같은 에러를 만났었습니다.
이에, 해당 문제를 해결할 수 있는 방법인 nonlocal과 global 변수 범위 지정 키워드에 대해서 정리하고자 합니다.
def solution(numbers, target):
answer = 0
length = len(numbers)
def dfs(i, val):
if val == target and i == length - 1:
answer += 1
return 0
if i + 1 < length:
dfs(i + 1, val + numbers[i + 1])
dfs(i + 1, val - numbers[i + 1])
dfs(-1, 0)
return answer
처음에는 위와 같이 코드를 작성하였습니다.
저는 solution 함수 내에 answer 변수가 선언 되어 있으므로, dfs 함수 내에서도 사용할 수 있을 것이라 생각하였습니다.
에러 코드를 보면 '할당되지 않아서' 에러가 발생함을 알 수 있습니다.
파이썬 컴파일러는 dfs 내의 answer 변수를 solution 함수 내의 answer 변수와 동일한 변수로 보지 않고, dfs 함수 내의 '로컬 변수'로 인식하여 발생하는 에러였습니다.
def solution(numbers, target):
answer = 0
length = len(numbers)
visited = [False] * length
def dfs(i, val):
nonlocal answer
if val == target and i == length - 1:
answer += 1
return 0
if i + 1 < length:
dfs(i + 1, val + numbers[i + 1])
dfs(i + 1, val - numbers[i + 1])
dfs(-1, 0)
return answer
첫번째 해결 방법은 dfs 함수 내에 answer라는 변수에 nonlocal 이라는 keyword를 지정해주는 것입니다.
해당 키워드를 지정하게 되면, answer이라는 변수를 dfs 함수 내의 로컬 변수로 취급하지 않고 solution 함수 내의 answer 변수를 의미한다고 설정해주는 것입니다.
def solution(numbers, target):
global answer
answer = 0
length = len(numbers)
visited = [False] * length
def dfs(i, val):
global answer
if val == target and i == length - 1:
answer += 1
return 0
if i + 1 < length:
dfs(i + 1, val + numbers[i + 1])
dfs(i + 1, val - numbers[i + 1])
dfs(-1, 0)
return answer
두번째 해결 방법은 global이라는 keyword를 지정해주는 것입니다.
global 변수는 해당 변수를 전역 변수로 사용하겠다는 것을 의미합니다.
따라서 위와 같이 각 함수 내에 global이라는 keyword를 사용하여 answer이라는 변수를 로컬 변수가 아닌 전역 변수로 설정해주는 방법이 있습니다.
'파이썬 > info' 카테고리의 다른 글
파이썬 deque TypeError: cannot unpack non-iterable int object (0) | 2022.07.13 |
---|---|
[백준 알고리즘] 메모리 초과 발생 이유 및 해결 방안 (2) | 2022.07.08 |
[백준알고리즘] 런타임 에러(RecursionError) 발생 이유 및 해결 방법 (0) | 2022.07.06 |