Python列表中的值被覆盖

Python列表中的值被覆盖,python,list,linear-algebra,Python,List,Linear Algebra,我正在计算某种不同大小的矩阵a的一些值。即后向误差、前向误差、条件数和误差放大率(均为无穷范数)。我的值被计算出来,然后我试图将它们放入列表中,通过增加矩阵A的大小进行循环。问题是,每次循环后,列表中的值都会被当前条件数覆盖,我不明白为什么。这是我的密码 import numpy as np import math as m from scipy import io, integrate, linalg, signal from scipy.sparse.linalg import eigs

我正在计算某种不同大小的矩阵a的一些值。即后向误差、前向误差、条件数和误差放大率(均为无穷范数)。我的值被计算出来,然后我试图将它们放入列表中,通过增加矩阵A的大小进行循环。问题是,每次循环后,列表中的值都会被当前条件数覆盖,我不明白为什么。这是我的密码

import numpy as np
import math as m
from scipy import io, integrate, linalg, signal
from scipy.sparse.linalg import eigs

sizes = [50, 100, 200, 300, 400]
forward_errors = sizes
backward_errors = sizes
magnification_factors = sizes
cond_numbers = sizes

number = 0
for n in sizes:
    A = np.zeros((n, n))

    # fill out matrix
    i = 0
    while(i < n):
        j = 0
        while(j < n):
            A[i, j] = 1.0 / (abs(i - j)**2.0 + 1.0)
            j = j + 1

        i = i + 1


    # fill out x_exact
    x_exact = np.ones((n, 1))

    # calculate b
    b = A.dot(x_exact)

    # calculate x_approx
    x_approx = linalg.solve(A, b)

    # calculate forward error
    forward_error = linalg.norm(x_approx - x_exact, ord=np.inf)
    print("forward_error = " + str(forward_error))

    # calculate residual, backwards error
    r = b - A.dot(x_approx)
    #print("r = " + str(r))


    # calculate error magnification
    error_mag = ((forward_error * linalg.norm(b, ord=np.inf)) / 
        (linalg.norm(r, ord=np.inf) * linalg.norm(x_exact, ord=np.inf))) 
    #print("error_mag = " + str(error_mag))

    # calculate inf-norm condition number of A
    cond_number = linalg.norm(A, ord=np.inf)
    print("cond_number = " + str(cond_number))

    forward_errors[number] = forward_error
    print(forward_errors)
    backward_errors[number] = r
    magnification_factors[number] = error_mag
    #print("magnification_factors = " + str(magnification_factors))
    cond_numbers[number] = cond_number
    print("cond_numbers = " + str(cond_numbers))
    #TODO figure out why these 4 are getting overwritten by cond_number

    number = number + 1

#TODO figure out why these 4 only print the condition numbers string
print("forward_errors = " + str(forward_errors))
print("backward_errors = " + str(backward_errors))
print("magnification_factors = " + str(magnification_factors))
print("cond_numbers = " + str(cond_numbers))

我把所有的打印语句都放在测试的注释后面,这就是我如何发现所有内容都被条件编号所取代的原因。我怀疑这一定是一些简单的Python的东西,我没有得到。我只是不明白为什么或者在哪里所有的东西都被覆盖了,这对我来说太奇怪了。感谢您的阅读。

这是由于Python处理变量引用的方式造成的

你什么时候做的

sizes = [50, 100, 200, 300, 400]
forward_errors = sizes
backward_errors = sizes
magnification_factors = sizes
cond_numbers = sizes
您基本上是共享变量
size
引用,而不是它的值。这意味着
向前错误
向后错误
放大系数
条件数
对于Python来说是完全相同的变量


你有一些选择来解决这个问题

1-使用复制库

from copy import deepcopy

sizes = [50, 100, 200, 300, 400]

forward_errors = deepcopy(sizes)
backward_errors = deepcopy(sizes)
magnification_factors = deepcopy(sizes)
cond_numbers = deepcopy(sizes)
2-简单地重复这些值

sizes = [50, 100, 200, 300, 400]

forward_errors = [50, 100, 200, 300, 400]
backward_errors = [50, 100, 200, 300, 400]
magnification_factors = [50, 100, 200, 300, 400]
cond_numbers = [50, 100, 200, 300, 400]

您可以找到有关该主题的更多信息

sizes = [50, 100, 200, 300, 400]

forward_errors = [50, 100, 200, 300, 400]
backward_errors = [50, 100, 200, 300, 400]
magnification_factors = [50, 100, 200, 300, 400]
cond_numbers = [50, 100, 200, 300, 400]