파일에서 단어를 읽어 목록에 저장하기, 두 번째
>>> wordfile_to_list("data/a-words.txt")
['acclimations', 'airways', 'antinarrative', 'astrocyte']
>>> wordfile_to_list("data/b-words.txt")
['acclimations', 'airways', 'antinarrative', 'astrocyte', 'buggiest', 'biros', 'bushvelds', 'begazed', 'braunite']
>>> wordfile_to_list("data/b-words.txt", ['brine'])
['brine', 'buggiest', 'biros', 'bushvelds', 'begazed', 'braunite']
a-words.txt를 읽는 첫 번째 단계에서는 모든 것이 제대로 동작하는 것처럼 보입니다. 하지만 놀랍게도 b-words.txt를 읽는 두 번째 단계에서 호출 결과가 서로 독립적이 아니라 누적되고 있다는 것을 알 수 있습니다. 그러나 b-words.txt를 새로 읽는 세 번째 단계에 다다르면 이상하게도 다시 누적이 되지 않습니다.
파이썬의 실행 모델을 떠올려 보면 여기서 일어나고 있는 일을 이해하는 것이 그리 어렵지 않습니다. 예약어 매개 변수는 정의되는 시점에 평가됩니다. 주어진 범위 안에서 파이썬의 모든 행은 정의되는 시점에 평가되므로 이것은 놀라운 일이 아닙니다. initial_words 목록은 정의되는 시점에 처음 정의되며, 호출 시 다른 객체로 대체되지 않는 한 호출마다 매번 동일한 객체가 확장됩니다. 하지만 역시 이상한 동작 방식임에는 틀림없습니다.
함수 호출 또는 그와 동등한 작업에서 상태가 유지되어야 한다면, ‘불변 기본값’ 편법을 사용하지 않더라도 문제를 해결할 수 있는 좋은 방법이 여러 가지 있습니다.