用户定义函数修改参数,尽管它不应该

时间:2019-07-18 14:44:05

标签: python-3.x

为了便于练习,我使用嵌套列表(例如[[1,0],[0,1]]是2 * 2单位矩阵)作为矩阵。我试图通过将行列式简化为上三角矩阵然后乘以其对角线项来计算行列式。为此:

"""adds two matrices"""
def add(A, B):
    S = []
    for i in range(len(A)):
        row = []
        for j in range(len(A[0])):
            row.append(A[i][j] + B[i][j])
        S.append(row)
    return S

"""scalar multiplication of matrix with n"""
def scale(n, A):
    return [[(n)*x for x in row] for row in A]

def detr(M):
    Mi = M
    #the loops below are supossed to convert Mi
    #to upper triangular form:
    for i in range(len(Mi)):
        for j in range(len(Mi)):
            if j>i:
                k = -(Mi[j][i])/(Mi[i][i])
                Mi[j] = add( scale(k, [Mi[i]]), [Mi[j]] )[0]
    #multiplies diagonal entries of Mi:
    k = 1
    for i in range(len(Mi)):
        k = k*Mi[i][i]
    return k

在这里,您可以看到我将M(参数)设置为Mi,然后对Mi进行运算以使其变为上三角形状。因此,M应该保持不变。但是在使用detr(A)之后,print(A)打印上三角矩阵。我尝试过:

  • 设置X = M,然后设置Mi = X
  • 定义kill(M):返回M,然后设置Mi = kill(M)

但是这些方法不起作用。当我试图在另一个函数中使用detr(M)时,这引起了一些问题,这些问题可以绕开,但是为什么会这样呢?编译器在这里做什么,即使我仅对Mi进行操作,为什么还要修改M?

(我正在使用Spyder 3.3.2,Python 3.7.1)

(很抱歉,这个问题很愚蠢,但是我只是开始学习python并开始学习编码一般。这个问题对我来说意义重大,因为我仍然对该语言没有深刻的了解。)< / p>

1 个答案:

答案 0 :(得分:0)

有关分配的信息,请参见python文档: https://docs.python.org/3/library/copy.html

  

Python中的Assignment语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此一个副本可以更改一个副本而无需更改另一个副本。

您需要先import copy,然后再使用Mi = copy.deepcopy(M)

另请参阅 How to deep copy a list?