파이썬은 공유로 호출하는 매개변수 전달 방식만 지원하고, 루비,스몰크, 자바등의 대부분의 객체지향 언어에서 사용하는 방식과 동일하다.
공유로 호출한다는 말은 함수의 각 매개변수가 인수로 전달받은 각 참조의 사본을 받는 것으로 함수 안의 매개변수는 실제 인수의 별명이 된다.
함수는 인수로 전달받은 모든 가변 객체를 변경할 수 있지만, 객체의 정체성 자체는 변경할 수 없고 어떤 객체를 다른 객체로 바꿀 수는 없다.
매개변수 중 하나에 +=연산자를 사용하는 간단한 함수를 보여주면서, 함수에 숫자,리스트,튜플을 전달하면 전달받은 인수는 서로 다른 영향을 받는다.
#유령 승객이 출몰하는 버스
bus1 = HauntedBus(['Alice', 'Bill'])
bus1.passengers
bus1.pick('Charlie')
bus1.drop('Alice')
bus1.passengers
bus2 = HauntedBus()
bus2.pick('Carrie')
bus2.passengers
bus3 = HauntedBus()
bus3.passengers
bus3.pick('Dave')
bus2.passengers
bus2.passengers is bus3.passengers
bus1.passengers
명시적인 승객 리스트로 초기화되지 않은 Bus 객체들이 승객 리스트를 공유하게 되는 문제가 발생하므로 버그를 찾아내기 쉽지 않다.
기본값은 함수 객체의 속성이 되는 것으로 기본값이 가변 객체고, 객체를 변경하면 변경 내용 이 향후에 이 함수의 호출에 영향을 미친다.
dir(HauntedBus.__init__)
HauntedBus.__init__.__defaults__