Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 기본 매개변수 값 설정 방법: 가변 객체 함정 완벽 정리

파이썬(Python)의 기본 매개변수(default parameter) 처리 방식은 초보 프로그래머들이 가장 혼란스러워하는 부분 중 하나입니다.

가변 객체를 기본값으로 사용할 때 생기는 문제

문제의 원인은 가변(mutable) 객체를 기본값으로 사용하는 것입니다. 가변 객체란 리스트(list)나 딕셔너리(dictionary)처럼 원본을 직접 수정할 수 있는 객체를 말합니다.

많은 개발자는 함수가 호출될 때마다 새로운 리스트가 생성되어 다음과 같은 결과를 기대합니다.

[12]
[43]

하지만 실제 파이썬의 동작은 다릅니다. 기본 인자로 지정된 리스트는 함수가 정의되는 시점에 단 한 번만 생성되며, 이후 모든 호출에서 동일한 리스트 객체가 재사용됩니다.

기본 인자의 평가 시점

파이썬의 기본 인자는 함수가 호출될 때마다 평가되는 것이 아니라, 함수가 정의되는 시점에 딱 한 번만 평가됩니다. 따라서 가변 객체를 기본값으로 사용하고 그 객체를 수정하면, 해당 변경 사항이 이후의 모든 함수 호출에도 그대로 영향을 미치게 됩니다.

올바른 해결 방법

함수가 호출될 때마다 새로운 객체를 생성하려면, 인자가 전달되지 않았음을 알려주는 신호 역할의 기본값을 사용해야 합니다. 일반적으로 None이 가장 좋은 선택입니다.

예제 코드

def func(data=[]):
    data.append(1)
    return data

func()
func()

def append2(element, foo=None):
    if foo is None:
        foo = []
    foo.append(element)
    return foo

print(append2(12))
print(append2(43))

위 코드에서 append2 함수는 foo=None을 기본값으로 받고, 함수 내부에서 fooNone인 경우에만 새로운 리스트를 생성합니다. 이렇게 하면 호출할 때마다 독립적인 리스트가 만들어지므로 의도하지 않은 상태 공유 문제를 피할 수 있습니다.

실행 결과

[12]
[43]

정리

  • 파이썬의 기본 인자는 함수 정의 시점에 한 번만 평가됩니다.
  • 리스트, 딕셔너리 등 가변 객체를 기본값으로 사용하면 호출 간에 상태가 공유되어 버그가 발생할 수 있습니다.
  • 기본값으로 None을 사용하고, 함수 내부에서 필요할 때 새 객체를 생성하는 것이 안전한 관례(idiom)입니다.