안녕하세요. 이번 시간에는 python parameter의 default value와 설정할 때 주의해야 할 점이 없는지 알아봅시다.

 


 먼저 default value는 argument를 넘겨받지 않았을 때 대신할 값을 의미합니다. 위 프로그램을 봅시다. x가 있고, test라는 이름을 가진 keyword argument가 있습니다. test=?? 꼴로 붙어있는 것을 볼 수 있을 텐데요. 이 ??를 디폴트 값이라고 이야기 합니다. 저는 이 디폴트 값을 list로 설정했는데요. 실행 결과를 볼까요?

 

 

 실행 결과를 보았더니, [1], [1, 2]가 떨어집니다. 예상하지 못했던 결과인데요. 왜 그렇게 되었는지 문서를 보면서 차근차근 보도록 하겠습니다.

 

 


 default value는 함수가 define 될 때 생성됩니다. 함수 a가 생성되었다고 해 봅시다. 그러면, 실제 구조와는 다를 수 있겠지만, 문서에 나온 대로 도식화를 시켜 보면 아래와 같은 상황이 되어 버릴 겁니다.

 

 test의 default value를 위한 list 객체를 생성합니다. 이걸 객체 A라 하겠습니다. 이제 a(1)을 호출합니다.

 

 그러면 default value인 객체 A에 append 1을 하였기 때문에, 객체 A는 위와 같은 상태가 되어 버립니다.

 

 

 다시 a(2)를 호출해 봅시다. 그러면, test의 default 값인 객체 A를 가져오는데, 이미 1이 추가된 상태에서 2를 append 하기 때문에, a(2)가 끝난 이후에는 위와 같이 상태가 바뀝니다. 따라서, a(1)을 호출했을 때 [1]이 출력되고, 또 다시 a(2)를 호출했을 때 [1, 2]가 호출되게 됩니다.

 

 여기서 정리. parameter의 default value를 위한 객체는 함수가 정의될 때 생성됩니다. 그래서, default value가 mutable한 객체일 때에는 문제가 발생할 수 있습니다.

 

 


 이제 default value로 None을 넣어봅시다. 이것은, value가 absence할 때 쓰일 수 있어요. argument가 pass되지 않을 수도 있을 때 이것을 쓰는데요. 장고에서 pk=None과 같은 문법을 꽤나 본 적이 있을 겁니다. 이것 역시, 파라미터로 받아버리는 pk가 함수를 부르는 쪽에서 pk를 넘길 수도 있고, 넘기지 않을 수도 있다는 의미입니다. 만약에 넘기지 않았다면 None으로 받습니다.

 

 

 이제 위 프로그램을 봅시다. test=None이라고 되어 있는데요. 기본적으로 test를 넘겨주지 않으면, None으로 설정하겠다는 의미겠네요. 이제, 2번째 줄의 if문을 봅시다. test가 None이라면, 새로운 list를 생성합니다. 이제, 8 ~ 9번째 줄을 봅시다. 2번째 argument를 넘겨주지 않았기 때문에, test=None으로 들어오게 됩니다. 그래서 a(1)을 호출했을 때에는 [1]이, a(2)를 호출했을 때에는 [2]가 출력되게 됩니다.

 

 

 결과는 위와 같습니다.

 

 


 이 경우는 어떨까요?

 

 결과를 예측하는 것은 어렵지 않습니다. 인자가 하나만 넘겨졌을 때, default 값으로 5를 받기 때문에, 5번째 줄의 결과는 20 5가 나올 거고, 6번째 줄의 결과는 1 3이 나올 것입니다.

 

 그런데, 한 가지 다른 점이 있습니다. 가장 첫 번째 예제에서는 default value로 list를 넘겼다면, 이번에는 int로 넘겼다는 것입니다.

 

 

 그러면 문제가 없을까요? int는 불변 객체이기 때문에, test를 1개의 인자만 가지고 계속 호출해 봐도 int 객체의 값이 변하지 않습니다. 따라서 문제가 되지 않습니다.