개발자 블로그
함수에서 디폴트 파라미터 사용 시 주의사항 본문
함수를 정의하고, 파라미터의 기본값을 정의를 하는 경우가 많다. 하지만, 사용 시 주의 사항이 있다. 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 |