2014-11-13 3 views
1

LU.py라는 파일에 정의 된 함수 (crout)와 다른 파일에 정의 된 다른 함수 (invert.py)가 있습니다. 파일의 내용은 다음과 같습니다python 함수가 요청하지 않은 변경을합니다.

LU.py

def crout(A,L,U): 
    N = len(A) 
    add = 0 

    #print(L,U) 
    for i in range(N): 
    print('b',L[i][i]) 
    U[i][i] = 1 
    print('a',L[i][i]) 
    #print(L,U) 

내가 역에서 한 번, 반전 파일에서 함수 crout 두 번 실행

import LU 

def inverse(A): 
    n = len(A) 
    B = [] 
    L = [] 
    U = [] 
    for i in range(n): 
     row = [0 for j in range(n)] 
     B.append(row) 
     L.append(row) 
     U.append(row) 
    LU.crout(A,L,U) 
    return B 

M = [[1,2,3],[1,0,1],[2,2,0]] 
Mi = inverse(M) 

A = [[1,2,3],[1,0,1],[2,2,0]] 
L = [[0,0,0],[0,0,0],[0,0,0]] 
U = [[0,0,0],[0,0,0],[0,0,0]] 
print('bla') 
LU.crout(A,L,U) 

공지 사항을 invert.py 함수 밖에서 한 번. 다음으로, 나는 우분투 리눅스 시스템에서 파이썬 2.7.6를 사용하여 invert.py 파일을 실행하고 나는 다음과 같은 출력을 얻을 :

역 내에서 crout의 통화 인 '즐'이전
('b',0) 
('a',1) 
('b',0) 
('a',1) 
('b',0) 
('a',1) 
bla 
('b',0) 
('a',0) 
('b',0) 
('a',0) 
('b',0) 
('a',0) 

숫자를 배열 L에서 대각선의 요소를 나타냅니다. U의 값을 변경하면 이러한 값이 0 ('b')에서 1 ('a')로 변경됩니다. 반면에 함수 역함 밖에서 crout을 호출하면 U를 변경 한 후에 L 값이 변경되지 않고 그대로 유지됩니다.

왜 이런 일이 발생했는지에 대한 아이디어는 대단히 감사하겠습니다!

for i in range(n): 
     row = [0 for j in range(n)] 
     B.append(row) 
     L.append(row) 
     U.append(row) 

이제 각 목록은 동일한 row 값에 대한 참조를 포함하면 append B, L의 각 로우 변수 및 U. inverse 카를로스

+0

python 변수 유효 범위 검사 규칙은 무엇입니까? –

답변

1

. 목록 중 하나에서 값을 변경하면 서로의 값이 변경됩니다. 원하는 동작이 아닌 경우 각 목록에 대해 새 행을 만듭니다.

for i in range(n): 
     B.append([0 for j in range(n)]) 
     L.append([0 for j in range(n)]) 
     U.append([0 for j in range(n)]) 

이 기능이 조금 비현실적으로 보이면 매트릭스 작성 논리에 대해 독립적 인 기능을 만드는 것이 유용 할 수 있습니다.

def make_square_matrix(size): 
    return [[0]*size for b in range(size)] 

def inverse(A): 
    n = len(A) 
    B = make_square_matrix(n) 
    L = make_square_matrix(n) 
    U = make_square_matrix(n) 
    LU.crout(A,L,U) 
    return B 
+0

감사합니다. 범위 규칙은 C와 완전히 다릅니다. – Carl

+0

L과 U가 수정 될 때 B가 더 이상 수정되지 않으므로 'inverse'는 항상 0을 제외한 행렬을 반환합니다. 나는 실제'inverse' 함수가 질문에 나타나는 것보다 더 많은 코드를 포함하고 있다고 가정하고 있으며, B는 결국 더 유용한 값을 갖도록 수정됩니다. – Kevin

+0

네, 코드가 더 있습니다 만, 실수 한 부분을 위해 방금 나갔습니다. – Carl

관련 문제