본문 바로가기

Computer/Python

Mutable Default Arguments

반응형

파이썬은 굉장히 직관적인 언어입니다. 상대적으로 간단한 문법과 범용성으로 다양한 분야에서 많은 사람들이 사용하고 있지만 놓치기 쉬운 가벼운 실수들이 있습니다. 이번 포스트에서 살펴볼 것은 함수 정의에서 리스트 등의 가변 변수가 디폴트 값으로 설정되었을 때 발생하는 현상입니다.

다음과 같은 함수를 작성했을 때,

def append_to(element, to=[]):
	to.append(element)
    return to
    
my_list = append_to(12)
print(my_list)

my_other_list = append(42)
print(my_list)

우리가 기대하는 실행 결과는 'append_to' 함수가 호출되었을 때마다 'to' argument의 새로운 리스트가 생성되어 [12], [42] 가 될 것입니다. 하지만, 실제 실행결과는 [12], [12,42] 가 나옵니다.

append_to 함수에 디폴트로 선언된 'to' argument 에 디폴트로 선언된 함수가 처음 정의되었을 때 한번 생성됩니다. 따라서 이후 같은 함수가 호출되어도 'to' argument 에 리스트가 새롭게 생성되는 것이 아니라 기존에 생성된 리스트가 사용됩니다.

리스트는 파이썬에서의 대표적인 가변 객체 (Mutable Object) 입니다. 즉, 선언된 객체의 값을 바꾸거나 추가할 수 있는, 변경할 수 있는 객체라는 것이죠. 따라서 리스트는 append 메소드를 통해 값을 추가하거나 값을 바꾸는 행위를 해도 객체 id 가 변하지 않습니다.

따라서 다음과 같이 함수가 호출될 때마다 argument 가 아닌 함수 내부에서 새롭게 리스트를 생성하도록 합니다. 이러한 경우 보통 argument 에 None을 놓습니다.

def append_to(element, to=None):
    if to is None:
    	to = []
    to.append(element)
    return to

반응형

'Computer > Python' 카테고리의 다른 글

Pycharm - Python Interpreter  (0) 2021.05.11
예외 처리에서의 동작 수행 - try/except/else/finally  (0) 2021.05.04
Pycharm 설치  (0) 2021.04.28
itertools 모듈  (0) 2021.03.02
collections 모듈 (5) - deque  (0) 2021.02.28