default argument값이 자꾸 바뀌어요
조회수 2234회
저는 밑에 코드가 항상 [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 답변
-
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
함수를 호출할 때마다 매 번
a = []
a.append(5)
return a
가 실행되는 것이 아니라
함수
foo()
의 정의에서a = []
는 단 한번 실행되고, 계속 그 값을 유지하고 있지요. 그 뒤로 함수를 호출할 때마다a.append(5)
return a
가 실행되면서 a가 점점 더 길어지는 것입니다.
댓글 입력