또 한 가지 빠지기 쉬운 중요한 함정이 있다. 키가 없으면 setdefault에 전달된 디폴트 값이 별도로 복사되지 않고 딕셔너리에 직접 대입된다. 이런 동작으로 인해 값이 리스트일 때 어떤 상황이 벌어지는지 다음 코드를 보자.
data = {}
key = "foo"
value = []
data.setdefault(key, value)
print("이전:", data)
value.append("hello")
print("이후:", data)
>>>
이전: {'foo': []}
이후: {'foo': ['hello']}
따라서 디폴트 값을 setdefault에 전달할 때마다 그 값을 새로 만들어야 한다. 즉, 호출할 때마다 리스트를 만들어야 하기 때문에, 성능에 상당히 큰 비용이 추가된다. 만약 가독성과 효율성을 향상시키기 위해 디폴트 값에 쓰는 객체를 재활용한다면 이상한 동작과 버그가 생길 것이다(이런 유형의 다른 문제를 보고 싶다면 아이템 36 “None과 독스트링을 사용해 동적인 디폴트 인자를 지정하라”를 참조하라).