2011-05-09 4 views
0

가능한 중복 :
“Least Astonishment” in Python: The Mutable Default ArgumentPython 2.7의 버그 또는 오해?

내가 여기서 뭔가를 놓치고 또는이 정말 버그? 다음은 튜플 스펙에서 다차원리스트를 생성하는 재귀 함수입니다 (예 :).

dim((2,3)) 
returns 
[[[],[],[]],[[],[],[]]] 

유일한 문제점은리스트마다 I 기본 파라미터없이 호출하면 I 희미 같은 기본 파라미터 지정하면 I가, 호출 추가하는 것이다 ((2,3), []) , 그럼 괜찮아. 각 호출의 기본 매개 변수 상태를 저장합니다! 내가하는 일에 아무도 문제가 없다면 Python 버그 리포터에 입력 할 것입니다.

cdr = lambda l : l[1:] 
car = lambda l : l[0] 
last = lambda x : x[-1:][0] 


def dim(t, c = []): 
    if len(t) > 0: 
     i = car(t) 
     for j in range(i): 
      c.append([]) 
      dim(cdr(t), last(c)) 
    return c 


print dim([2,3]) 
print dim([2,3]) 
print dim([2,3]) 
print dim([2,3]) 

답변

0

def dim(t, c = [])

그것은 (코드에) 버그입니다. 그 부분 c = [] 전체 프로그램 동안 한 번만 평가됩니다. 흐리게 전화하면 c이 계속 첨부됩니다. 더 나은 방법은 다음과 같습니다.

def dim(t, c=None): 
    if c is None: 
     c = [] 
    ... 
+0

정확히. 그러나 단발음 (singlepick)과 비교할 때''is ''가 가장 좋습니다. 물론''None '/'c = None/c/None 인 경우. – delnan