2017-05-13 54 views
-1

在下面的main方法,为什么传递一个数组的副本仍然会改变原始数组的值?

月1日:我试图通过a.copy()b.copy()作为参数。虽然solve_linear_equations方法返回了有效的解决方案,但它仍然篡改原始参数a[][]b[]

第二:然后,我试图定义两个不同的变量,如tmp_a = a.copy()tmp_b = b.copy()。使用这些新变量作为方法参数也没有帮助:不总是,但通常,该方法篡改原始数组值a[][]b[]

我认为,Python内部存在一些棘手的问题,我无法实现。有人可以举手吗?

import random 


def data_create(n): 
    a, x, b = [], [], [] 

    for i in range(n): 
    a.append([]) 
    s = random.randint(0, 2) 
    x.append(random.randint(0, 1000)/1000) 

    if s: 
     x[i] *= -1 

    for j in range(n): 
     s = random.randint(0, 2) 
     a[i].append(random.randint(0, 1000)/1000) 

     if s: 
     a[i][j] *= -1 

    for i in range(n): 
    b.append(0.0) 

    for j in range(n): 
     b[i] += a[i][j] * x[j] 

    return a, x, b 


def solve_linear_equations(n, a, x): 
    for i in range(n - 1): 
    max_row = i 
    max_val = abs(a[i][i]) 

    for j in range(i + 1, n): 
     if abs(a[j][i]) > max_val: 
     max_val = abs(a[j][i]) 
     max_row = j 

    if max_row != i: 
     x[i], x[max_row] = x[max_row], x[i] 
     a[i], a[max_row] = a[max_row].copy(), a[i].copy() 

    x[i] /= a[i][i] 

    for j in range(i + 1, n): 
     a[i][j] /= a[i][i] 

    a[i][i] = 1.0 

    for j in range(i + 1, n): 
     x[j] -= x[i] * a[j][i] 

     for k in range(i + 1, n): 
     a[j][k] -= a[i][k] * a[j][i] 

     a[j][i] = 0.0 

    x[n - 1] /= a[n - 1][n - 1] 
    a[n - 1][n - 1] = 1.0 

    for i in range(n - 1, 0, -1): 
    for j in range(i - 1, -1, -1): 
     x[j] -= x[i] * a[j][i] 

     for k in range(i, n): 
     a[j][k] -= a[i][k] * a[j][i] 

    return x 


def main(): 
    n = 3 
    a, x, b = data_create(n) 

    print("x\n", x) 
    print("a\n", a) 
    print("b\n", b, "\n") 

    tmp_a = a.copy() # creating a copy of a[][] 
    tmp_b = b.copy() # creating a copy of b[] 

    print("tmp_a\n", tmp_a) 
    print("tmp_b\n", tmp_b, "\n") 

    print("x\n", solve_linear_equations(n, tmp_a, tmp_b)) 
    print("a\n", a) 
    print("b\n", b, "\n") 


if __name__ == "__main__": 
    main() 
+0

仅供参考,我试图运行这个,我得到一个'ZeroDivisionError' – JacobIRR

+0

@JacobIRR,关于'ZeroDivisionError':你可能运行的代码就好像它是一个Python 2.x.尝试使用Python 3.x不会吐出错误。 – ssd

回答

4

而不是

tmp_a = a.copy() # creating a copy of a[][] 
    tmp_b = b.copy() # creating a copy of b[] 

import copy 
... 
tmp_a = copy.deepcopy(a) # creating a deep copy of a[][] 
tmp_b = copy.deepcopy(b) # creating a deep copy of b[] 

这是因为list.copy()只到达下一层,并且看到不必要的更改两级下来。

+0

我知道有内在的东西......非常感谢。 – ssd

相关问题