default argument값이 자꾸 바뀌어요


저는 밑에 코드가 항상 [5]를 return할 거라 생각했는데 값이 자꾸 바뀌어요.

foo()를 실행할 때마다 a=[]이 실행될 줄 알았는데 아닌가요? foo() 안에서는 무슨 일이 일어나고 있나요??

소스코드

def foo(a=[]):
    a.append(5)
    return a

실행 :

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()
  • 2016년 01월 13일에 작성됨

조회수 217


1 답변


좋아요
0
싫어요
채택취소하기

python의 function은 그냥 코드 조각이 아니라 first-class __object__입니다. 함수가 객체라는 뜻은 달리 말하면, 함수의 정의가 곧 객체로 평가(evaluate)된다는 의미입니다.

함수의 default 파라미터는 함수의 실행이 아닌 함수의 정의에 binding됩니다. 따라서 default 파라미터를 멤버 데이터처럼 쓸 수 있고, 함수를 call 할 때마다 상태를 바꿀 수 있습니다.

다음의 코드를 봐주세요

def a():
    print "a excuted"
    return 0

def b( x = a() ):
    pass

결과 : a excuted

a()도, b()도 부르지 않았는데 "a excuted"가 출력되었을까요? 바로 def b( x = a() ):에서, default 파라미터 x가 정의에 binding되어 있기 때문입니다. b()와 같이 코드를 실행시키지 않았지만, 함수의 정의에서 x가 초기화된것이지요.


이 코드도 마찬가지입니다.

def foo(a=[]):
    a.append(5)
    return a

함수를 호출할 때마다 매 번

  1. a = []
  2. a.append(5)
  3. return a

가 실행되는 것이 아니라

함수 foo()의 정의에서 a = []는 단 한번 실행되고, 계속 그 값을 유지하고 있지요. 그 뒤로 함수를 호출할 때마다

  1. a.append(5)
  2. return a

가 실행되면서 a가 점점 더 길어지는 것입니다.

  • 2016년 01월 13일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close