2013-08-31 2 views
2

함수를 재귀 적으로 호출하고 목록의 일부를 함수에 전달하려고합니다.파이썬 함수가 목록 값을 변경합니다.

def op3(c,i): 
    d = [] 
    for l in range(0,len(c),+1): 
     d.append(c[l]) 
    a, b = [], [] 
    if len(d)>=3: 
     for l in range(1,len(d)-1,+1): 
      a.append(d[l]) 
     for l in range(2,len(d),+1): 
      b.append(d[l]) 
     A,B = [],[] 
     for j in range(0,len(a),+1): 
      a[j][i] = a[j][i]+a[j][i+1] 
      a[j].pop(i+1) 
      insertf(a,final) 
      A.append(a[j]) 
     op3(A,i+1) 
     for k in range(0,len(b),+1): 
      b[k][i+1] = b[k][i+1]+b[k][i+2] 
      b[k].pop(i+2) 
      insertf(b,final) 
      B.append(b[k]) 
     op3(B,i+1) 

그러나 일본어 목록의 값은 루프가 실행 '대'중첩 된 후 제 (D)의 새로운 값리스트에서 'B'를 변경된다. 저는 파이썬을 처음 접했습니다. 나는 이것이리스트가 어떻게 파이썬에서 작동 하는지를 읽었다. 이 문제를 해결할 방법이 있을까요?

+2

'튜플'과 같은 불변의 데이터 구조를 사용합니까? 또는'newList = copy.deepcopy (otherList)'를 사용하면 완전히 별개의 목록을 만들 수 있습니까? –

+2

솔루션에 대해 묻는 대신, 해당 기능으로 해결하려는 실제 문제에 대해 질문하면 훨씬 더 유용한 대답을 얻을 수 있습니다. [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)를 참조하십시오. – Bakuriu

답변

1

모든 수정 된 C 스타일의 루프가 내 머리를 아프게합니다. 구문 분석하려고 시도 중입니다 ...

def op3(c,i): 
    d = c[:] 
    if len(d)>=3: 
    a=d[1:-1] 
    b=d[2:] 
    #A,B=[],[] 
    for item in a: 
     item[i] += item.pop(i+1) 
     insertf(a,final) # Totally unknown behaviour, does this modify a? 
     #A.append(item) # Seems pointless, A ends up a copy of a, and op3 
     #    # does not modify c (only its items) 
    op3(a,i+1) 
    for item in b: 
     item[i+1] += item.pop(i+2) 
     insertf(b,final) 
    op3(b,i+1) 

코드가 수행하는 것으로부터 목록의 목록을 예상하고 내부 목록을 수정합니다. 또한 정지 조건이없는 것처럼 보이는 방식으로 반복적으로 호출하지만 내부 목록에 any((len(ci)<=i+2 for ci in c))이 없으면 중단됩니다.

전체적으로 나는이 코드 조각이 원하는 것을 표현하지 못하기 때문에 좋은 대답을 드릴 수 없다고 말하고 싶습니다. 여기서 중요한 점은 목록이 2 차원이 아니라는 것입니다. 모든 목록 a [j] 또는 b [k]는 독립 객체입니다 (비록 동일한 목록 c에서 추출 했으므로 a[j] is b[j-1]). a, b, c, d, A, B에서 수행하는 조작에 대한 지식이 없습니다. .

보유하고있는 데이터 구조와 예상되는 처리 유형을 설명해 주시겠습니까? 그것은 numpy의 약 하나의 표현에 맞을 것 같은 느낌입니다.

관련 문제