Python 为什么传递数组的副本仍然会更改原始数组值?
在下面的Python 为什么传递数组的副本仍然会更改原始数组值?,python,arrays,python-3.x,Python,Arrays,Python 3.x,在下面的main方法中 第一:我试图将a.copy()和b.copy()作为参数传递。虽然solve\u linear\u equations方法返回了有效的解决方案,但它仍然会篡改原始参数a[][和b[] 第二:然后,我尝试将两个不同的变量定义为tmp\u a=a.copy()和tmp\u b=b.copy()。使用这些新变量作为方法参数也没有帮助:不总是,但通常,该方法会篡改原始数组值a[][]和b[] 我认为,关于Python内部有一个棘手的问题,我没有意识到。有人能帮忙吗 import
main
方法中
第一:我试图将a.copy()
和b.copy()
作为参数传递。虽然solve\u linear\u equations
方法返回了有效的解决方案,但它仍然会篡改原始参数a[][
和b[]
第二:然后,我尝试将两个不同的变量定义为tmp\u a=a.copy()
和tmp\u 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()
而不是
tmp_a = a.copy() # creating a copy of a[][]
tmp_b = b.copy() # creating a copy of b[]
做
这是因为list.copy()。尝试使用Python3.x不会抛出错误。我知道有一些内在的东西。。。谢谢。
import copy
...
tmp_a = copy.deepcopy(a) # creating a deep copy of a[][]
tmp_b = copy.deepcopy(b) # creating a deep copy of b[]