훈훈훈

파이썬 : 스코프(유효 범위)와 클로저 본문

파이썬/Python

파이썬 : 스코프(유효 범위)와 클로저

훈훈훈 2020. 1. 17. 01:05

/*해당 내용은 길벗 출판사의 파이썬 코딩의 기술이라는 책을 참조하였습니다.*/

 

 

# 스코프(Scope : 유효 범위)

변수가 유효만 범위를 뜻하며 대표적인 예로 지역변수와 전역변수가 있다.

 

# 클로저(Closure) 란

클로저는 자신의 정의된 스코프 안에 있는 변수를 참조하는 함수이다. 

 

# 코드 예시

위 예시는 리스트 정렬 시 우선순위가 높은 객체가 먼저 정렬 시키는 코드이다.

 

좀 더 자세히 살펴보면 line 8 에서 "numbers.sort(key=helper)" 코드는 key 값에 helper 함수를 담아

sort 함수를 호출하는 것을 알 수 있다.

해당 코드가 실행이 가능한 이유는 파이썬에서는 클로저를 지원하기 때문에 정의된 스코프에 있는 변수를 참조할 수 있기 때문이다.

결과 출력 시 group 리스트 내에 있는 객체들이 우선순위로 출력이 된 것을 확인할 수 있다.

 

하지만 다음과 같이 Found 값이 False로 출력되는 것을 확인할 수 있다. 

우선순위가 높은 객체를 리스트로 반환했지만 Found 값이 True로 반환되지 않은 이유는 Found 변수는 helper 함수에서는 True로 할당이되지만, sort_priority 함수에서는 여전히 False이기 때문이다.

따라서 해당 현상을 해결하기 위해서는 다음과 같이 helper 함수 내에 Found 변수를 "nonlocal"로 선언을 해야한다.

코드 실행 시 다음과 같이 Found 값이 True로 정상 출력이 되는 것을 알 수 있다.

nonlocal문을 이용하여 문제를 해결하였지만, 간단한 함수가 아니라면 nonlocal문을 사용하기 보다는 헬퍼 클래스를 사용하는게 더 좋다.

왜냐하면 오류 발생 시 nonlocal 문과 관련 변수에 대한 할당이 멀리 떨어질수록 코드 이해 및 원인을 파악하기 어렵기 때문이다.

 

 

Comments