개발자 블로그

함수에서 디폴트 파라미터 사용 시 주의사항 본문

파이썬/알쓸신잡

함수에서 디폴트 파라미터 사용 시 주의사항

hayongwoon 2022. 8. 16. 16:13

함수를 정의하고, 파라미터의 기본값을 정의를 하는 경우가 많다. 하지만, 사용 시 주의 사항이 있다. mutable 한 객체를 함수의 디폴트 파라미터로 사용하지 말라는 것이다.

 

예제를 통해 살펴보자!

def add_sharp(s = []):
    s.append('#')
    return s

s = [1, 2, 3]
print(add_sharp(s)) # [1, 2, 3, '#']

print(add_sharp()) # ['#']
print(add_sharp()) # ['#']
print(add_sharp()) # ['#']

우리가 예상한 결과값은 주석 처리를 한 값이다. 하지만, 실제 결과값은 그렇지 않다.

위 예제 코드의 결과

파이썬에서 함수의 디폴트 인자들은 __defaults__ 또는 __kwdefaults__ 어트리뷰트의 저장된다고 한다. 파이썬은 함수가 호출 될 때마다 새로운 객체를 생성하는 것이 아니라 __defaults__ 또는 __kwdefaults__ 어트리뷰트에 저장되어 있는 디폴트 파라미터를 참조하기 때문이다.

 

따라서, immutable 객체를 활용하거나 None 값을 활용하여 분기를 나누어 의도한데로 결과를 도출해낼 수 있다.

아래 예제는 None 값으로 디폴트 인자를 활용해보는 예제!

def add_sharp(s = None):
    if s is None:
    	s = []
    s.append('#')
    return s

s = [1, 2, 3]
print(add_sharp(s)) # [1, 2, 3, '#']

print(add_sharp()) # ['#']
print(add_sharp()) # ['#']
print(add_sharp()) # ['#']

의도한 결과값

결론, 디폴트 인자로는 정수와 같은 immutable한 객체를 사용하자. *list와 같은 immutable은 안 됨.

만약, 사용을 해야한다면, None을 디폴트 인자로 두고 분기를 두어 설정하자!

'파이썬 > 알쓸신잡' 카테고리의 다른 글

재귀함수와 스택 메모리  (0) 2022.08.16
파이썬 메모리 구조  (0) 2022.06.28
Variable Scope  (0) 2022.06.27
object(객체)의 attribute(속성 값)의 접근 가능한 함수  (0) 2022.06.21
eval() 메소드  (0) 2022.06.08