- [BW 21] 변수 영역과 클로저의 상호작용 방식을 이해하라2024년 10월 23일
- 31514
- 작성자
- 2024.10.23.:43
다음 코드는 특정 그룹에 존재하는 숫자를 먼저 정렬하고, 나머지 숫자를 정렬하는 함수다.
def sort_priority(values, group): def helper(x): if x in group: return (0, x) return (1, x) values.sort(key=helper) numbers = [8, 3, 1, 2, 5, 4, 7, 6] group = {2, 3, 4, 7} sort_priority(numbers, group) print(numbers) >>> [2, 3, 4, 7, 1, 5, 6, 8]
이 함수가 예상대로 작동하는 세 가지 이유가 존재한다.
- 파이썬이 클로저를 지원한다.
- 클로저란 자신이 정의된 영역 밖의 변수를 참조하는 함수를 말한다.
- 클로저로 인해 helper 함수가 group 인자에 접근할 수 있다.
- 파이썬에서 함수가 일급 시민 객체다.
- 일급 시민 객체는 이를 직접 가리킬 수 있고, 변수에 대입하거나 다른 함수에 인자로 전달할 수 있으며, 식이나 if 문에서 함수를 비교하거나 함수에서 변환하는 것 등이 가능하다.
- 이로 인해 sort 메서드는 클로저 함수를 key 인자로 받을 수 있다.
- 파이썬에는 시퀀스를 비교하는 구체적인 규칙이 존재한다.
- 파이썬은 시퀀스를 비교할 때 0번 인덱스에 있는 값을 비교한 다음, 이 값이 같으면 다시 1번 인덱스에 있는 값을 비교한다.
- 이로 인해 helper 함수가 반환하는 튜플이 서로 다른 두 그룹으로 정렬하는 기준 역할을 할 수 있다.
영역 지정 버그
def sort_priority2(values, group): found = False def helper(x): if x in group: found = True return (0, x) return (1, x) values.sort(key=helper) return found numbers = [8, 3, 1, 2, 5, 4, 7, 6] group = {2, 3, 4, 7} found = sort_priority2(numbers, group) print(found) print(numbers) >>> False [2, 3, 4, 7, 1, 5, 6, 8]
위 코드를 살펴보면, 정렬은 잘 되지만 found의 값이 예상한 대로 나오질 않는다.
왜 이럴까?
변수가 현재 영역에 이미 정의돼 있다면 그 변수의 값만 새로운 값으로 바뀐다.
하지만 변수가 현재 영역에 정의돼 있지 않다면 파이썬은 변수 대입을 변수 정의로 취급한다.
결정적으로 이렇게 새로 정의된 변수의 영역은 해당 대입문이나 식이 들어 있던 함수가 된다.
이는 지역 변수가 그 함수를 포함하고 있는 모듈 영역을 더럽히지 못하게 막기 위해서다.
'Book > 파이썬 코딩의 기술' 카테고리의 다른 글
[BW 23] 키워드 인자로 선택적인 기능을 제공하라 (0) 2024.10.23 [BW 22] 변수 위치 인자를 사용해 시각적인 잡음을 줄여라 (1) 2024.10.23 [BW 20] None을 반환하기보다는 예외를 발생시켜라 (0) 2024.10.23 [BW 19] 함수가 여러 값을 반환하는 경우 절대로 네 값 이상을 언패킹하지 말라 (0) 2024.10.22 [BW 18] __missing__을 사용해 키에 따라 다른 디폴트 값을 생성하는 방법 (0) 2024.10.22 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)