2010-12-04 2 views
5
def a(b=[]): 
    b.append(1) 
    return b 

print a() 
print a() 

갑자기 나는 2 개의 elems로리스트를 얻었지만 어떻게 될까? 매번 빈 목록으로 설정해서는 안됩니다.파이썬에서 클로저 질문을 이해하지 못한다

감사합니다.

+2

참조 또한 http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –

답변

9

적어도 일상적인 의미에서 폐쇄와 관련이 없습니다.

b의 기본값은 "새로운 빈 목록"이 아닙니다. "함수를 정의하면서 지금 방금 만든이 특정 객체를 빈 목록으로 초기화"합니다. 함수가 인수없이 호출 될 때마다 동일한 객체가 사용됩니다.

10

기본 인수는 함수가 정의 될 때 한 번만 평가됩니다. 한 번의 호출에서 다음 호출까지 동일한 객체를 유지하므로 동일한 목록이 계속 추가됩니다. None의 기본값을 사용하고이를 확인하려면 대신 해당 값을 확인하십시오.

3

수정 된 버전이 다른 답변에 주어진 이유입니다 : 함수가 정의 될 때

def a(b=None): 
    b = [] if b is None else b 

    b.append(1) 
    return b 
1

기본 인수가 평가된다 (한 번),하지 때마다 그것은이라고합니다.

이 시도 :

def a(b=None): 
    if b is None 
     b = []  
    b.append(1) 
    return b 

print a() 
print a() 
관련 문제