python函数未经请求的更改

时间:2014-11-13 13:59:19

标签: python

我在名为LU.py的文件中定义了一个函数(crout),在另一个文件(invert.py)中定义了另一个函数。文件的内容是:

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)

和invert.py

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)

请注意,我从反转文件中运行了两次函数crout,一次从反函数运行,一次从函数外部运行。 接下来,我在ubuntu linux机器上使用python 2.7.6运行invert.py文件,我得到以下输出:

('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)

'bla'之前的数字是反向内部的crout调用,表示数组L中对角线的元素。请注意,这些值从0('b')变为1('a')为我改变了U中的值(当然不应该发生!)。另一方面,当我从函数反向外部调用crout时,L中的值在更改U后保持不变,这当然是应该发生的。

非常感谢任何关于为什么会发生这种情况的想法!

卡洛斯

1 个答案:

答案 0 :(得分:1)

inverse中,您将append行变量分别设置为B,L和U.

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

现在每个列表都包含对相同row值的引用。更改其中一个列表中的值将更改彼此的值。如果这不是所需的行为,请为每个列表创建一个新行。

  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