더북(TheBook)

파이썬 2의 스코프

불행하게도 파이썬 2는 nonlocal 키워드를 지원하지 않는다. 비슷한 동작을 얻으려면 파이썬의 스코프 규칙을 이용한 다른 방법이 필요하다. 그다지 깔끔한 방법은 아니지만 일반적인 파이썬 표현 방식이다.

# 파이썬 2

def sort_priority(numbers, group):

found = [False]

def helper(x):

if x in group:

found[0] = True

return (0, x)

return (1, x)

numbers.sort(key=helper)

return found[0]

 

앞에서 설명한 대로 파이썬은 현재 값을 알아내려고 found 변수가 어디서 참조되었는지 상위 스코프로 탐색해나간다. 트릭은 found의 값이 수정 가능한(mutable) 리스트라는 점이다. 이 말은 클로저에서 일단 found를 받아온 후에는 내부 스코프에서 (found[0] = True로) found의 상태를 바꿔서 데이터를 보낼 수 있다는 의미다.

이 방법은 스코프를 탐색하는 데 사용되는 변수가 딕셔너리나 세트 혹은 여러분이 정의한 클래스의 인스턴스일 때도 적용된다.

 

핵심 정리

• 클로저 함수는 자신이 정의된 스코프 중 어디에 있는 변수도 참조할 수 있다.

• 기본적으로 클로저에서 변수를 할당하면 바깥쪽 스코프에는 영향을 미치지 않는다.

• 파이썬 3에서는 nonlocal 문을 사용하여 클로저를 감싸고 있는 스코프의 변수를 수정할 수 있음을 알린다.

• 파이썬 2에서는 (아이템이 한 개만 있는 리스트 같은) 수정 가능한 값으로 nonlocal 문이 없는 문제를 우회한다.

• 간단한 함수 이외에는 nonlocal 문을 사용하지 말자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.