2013-06-30 1 views
2

행렬의 행렬식을 찾는 스 니펫을 작성했습니다. 행렬은 다음과 같은 중첩 목록으로 표현됩니다.원래 목록의 작업에서 목록의 복사본이 변경되었습니다.

[[2,3],[5,6]] 

여기서 외부 목록의 구성원은 행이고 내부 구성원은 열입니다.

몇 가지 요소를 제거하여 더 간단하게 매트릭스를 확장해야하는 단계에서 원래 목록의 백업을 다른 목록 'bak'에 저장하여 이후 확장시이를 사용해야했습니다.

그러나 첫 번째 확장 단계 후에 원래 목록의 값을 'bak'에서 복원하려고 시도하면 원래 목록의 작업이 'bak'에도 반영된 것 같습니다. 인쇄 "박"출력을

def determinant(matrix): 
     if len(matrix)==2: 
       det = matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1] 
     if len(matrix)>2: 
       flag=0 
       bak=[] 
       for x in matrix: 
         bak.append(x) 
       dump=[] 

       for ind,x in enumerate(matrix): 
         matrix.pop(ind) 
         for n,y in enumerate(matrix): 
           matrix[n].pop(ind) 

         dump.append(matrix) 
         print "bak",bak 
         matrix=bak 

matrix=[[1,2,3],[4,5,6],[7,8,9]] 
determinant(matrix) 

이었다 [1, 2, 3], [5, 6], [8, 9]가 추정 된 위치 될 [1,2,3] , [4,5,6], [7,8,9]]

어떤 개념을 감독하면 저를 도우십시오.

답변

4

원래 목록에 대한 참조 만 저장하고 있습니다.

bak.append(x[:]) 

또는

bak.append(list(x)) 

[:] 구문은 원래리스트의 마지막 요소에 대한 첫 번째에서 슬라이스에서 새 목록을 생성합니다 : 당신은 복사 대신을 만들려고합니다.

+0

bak.append (x [:]) bak.append가 완벽하게 작동 했으므로 원하는 출력을 얻었습니다. –

2

(당신이 당신의 머리 방법에있어처럼 당신이 보인다. 왜이 모든 전역 변수를해야합니까? 당신이 그런 짓을하기 전에 기능은, 첫째, 제대로 작동 방법에 대한 핸들을 가져옵니다.)

정말 사본이 아니기 때문에. bakmatrix과는 별개의 목록이지만 matrix과 동일한 목록을 모두 포함합니다.

외부 루프를 통과 할 때마다 matrixbak에서 "복원"할 수 있지만 복사본을 만들면 별칭을 지정할 필요가 없습니다! 따라서 두 번째로 루프를 통해 matrix의 이름을 bak과 동일한 목록의 이름으로 지정하게되고 이제 의도 된 "백업"목적이 무효화됩니다.

전체 접근 방식이 잘못되었습니다. "복사본을 만든 다음 반복해서 수정"을 시도하지 말고 "반복적으로 수정 된 버전 만들기"를 시작하십시오..

그리고 파이썬에게 어떻게 목록을 조합하는지 알려주 려합니다. 그것은 어떻게 알 수 있습니다.

작은 작업을 각각의 기능으로 분리하면 코드가 훨씬 간단 해집니다."요구에 의해 -

우리가 쉽게 우리에게 지정된 행과 열을 제외한 모든과 매트릭스를 제공하는 기능을 할 수 있습니다
def all_except(a_list, index): 
    return a_list[:index] + a_list[index + 1:] 

: 첫째, 지정된 요소를 제외하고 모든 것을 우리에게 목록을 제공하는 함수를 만들어 보자 상기 지정된 하나 "를 제외하고 각 행의 지정된 열이없는 행의 사본 :

def submatrix(matrix, r, c): 
    return [all_except(row, c) for row in all_except(matrix, r)] 
    # Alternatively: 
    # return [all_except(row, c) for i, row in enumerate(matrix) if i != r] 

그리고 지금 우리는 재귀을 실제로 할 수 있습니다. 실제로 미성년자 명단을 작성할 필요가 없습니다.

def determinant(matrix): 
    if len(matrix) < 2: raise ValueError 

    if len(matrix) == 2: 
     return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1] 

    return sum(
     column * (-1 ** r + c) * determinant(submatrix(matrix, r, c)) 
     for r, row in matrix 
     for c, column in row 
    )