2015년 11월 5일 목요일

Python 함수에 대한 흥미로운 예제

Python 함수에 대한 흥미로운 예제가 있어서 요약한다.

본문을 이해하는데 도움이 되는 용어를 먼저 정의한다.

객채 지향(object-oriented)의 함수형 프로그래밍(functional programming)에서는,
객채(object)의 성질에 따라 다음의 두가지로 분류 할 수 있다.

 * Immutable Object : 생성 이후에는 상태를 변경할 수 없는 객채다.
    예) Number, Character, Turple ... 
 * Mutable Object : 반대로, 생성 이후에도 상태를 변경할 수 있는 객채다.
    예) List, Dict, set

흥미로운 예제는 다음과 같다.

>> def foo (a = 0, b = [] ):
>>    print (a, b)
>>    a = a + 1
>>    b.append(1)

>> foo()
0 []
>> foo()
0 [1]
>> foo()
0 [1, 1]

상식을 벗어나는 결과에 당황 스럽지만, 해결책은 간단하다.
Mutable Object를 기본 인자값(default argument)로 사용하지 않는 것이다.

원인을 분석하면 다음과 같다.

1. 함수가 생성 될때, 2개의 입력 오브젝트 영역이 할당된다.
2. 함수가 수행 될때,
    a = a + 1 수행을 통해 a는 결과가 쓰여진 새로운 영역을 가르킨다.
    b.append(1) 수행을 통해 b의 입력 오브젝트 영역에 [1]이 추가 된다.

요점은 b의 경우 Mutable Object라 함수에 할당된 입력 오브젝트 영역의 상태가 변경 된 점이다.

원인을 알아도 실수하기 쉬운 부분이니 룰(rule)로 지정해서 사용하지 말자.
검증을 위해서는 Object의 메모리 주소를 반환해 주는 id 함수를 활용하자.

0 개의 댓글:

댓글 쓰기