[Python] Pyhon의 기본 매개변수 초기화에 대해서

Python의 기본 매개변수 초기화에 대해서

한 가지 예제를 통해서 파이썬의 매개변수 초기화 시점에 대해서 생각해보자.

def buggy(arg, result=[]):
    result.append(arg)
    print(result)

위의 buggy 라는 함수를 한번 실행해 보자 buggy(‘a’), buggy(‘b’) 라는 식으로 말이다.

기본 매개변수(result=[])에 대해서 다른 언어를 통해서 알고 있다면

buggy(‘a’) -> [‘a’], buggy(‘b’) -> [‘b’] 로 생각할 것이다.

결과는 아래와 같다.

>> buggy('a')

['a']

>> buggy('b')

['a', 'b']

어떻게 된 일일까? 기본 매개변수의 초기화 되는 시점에 대해서 함수를 호출(call)할 시점이 아니라

정의 되는 시점에서 result = [] 이 계산되기 때문이다.

그럼 여기서 추가적으로 이런 것을 고려해서 다른 예제를 하나 보자.

def nonbuggy(arg, result=None):
    if result is None:
        result = []
    result.append(arg)
    print(result)
    

nonbuggy(‘a’), nonbuggy(‘b’) 를 부르면 결과가 어떻게 될까?

결과는 아래와 같다.

>>> nonbuggy('a')

['a']

>>> nonbuggy('b')

['b']

어라 nonbuggy 는 첫번째 호출될 때 result 가 None 일 시점에서 result 값이 리스트([])로 변경이 되면

당연히 두번째부터는 result 가 리스트 상태인것이 아닌가?

result 에 빈 리스트가 대입되는 전 후로 id 값을 한번 찍어보면 재밌는 결과를 알 수 있다.

def nonbuggy(arg, result=None):
    if result is None:
        print(id(result))  #  4482439176
        result = []
        print(id(result))  #  4481633000
    result.append(arg)
    print(result)
    

실행해보면 대입 전후로 result 의 참조값이 바뀌는 것을 알 수 있다.

매개변수의 result 참조가 아니게 된다.