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()

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가 점점 더 길어지는 것입니다.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.