首页 > 解决方案 > 更改二维数组元素的值会更改整个列

问题描述

当我打印我arr的值时,我得到了我的二维数组的正确值,但是当我退出 while 循环时,我的值都是错误的。

我不确定我做错了什么。

    #num runs
    n = 4

    x = np.linspace(-1,1,n)
    y = np.linspace(-1,1,n)
    x1,y1 = np.meshgrid(x, y)

    l = np.linspace(0,1000,n)
    x = np.linspace(-1,1,n)
    p1,p2 = np.meshgrid(l,l)

    w020 = 5*(y1**2+x1**2)

    row, cols = (n,n)
    arr = [[0]*cols]*row
  
    i = 0
    p = 0
    while i < n:
        i += 1
        p=0
        while p < n:
            arr[i-1][p] = 2+2*math.cos(2*math.pi*w020[i-1,p])
            p += 1
    print(arr)       

标签: pythonperformancenumpywhile-loopoptics-algorithm

解决方案


您创建二维数组的方式创建了一个浅列表

    arr = [[0]*cols]*row

相反,如果你想更新列表的元素,你应该使用

   rows, cols = (5, 5) 
   arr = [[0 for i in range(cols)] for j in range(rows)] 

说明

可以使用以下方法创建列表:

   arr = [0]*N 

或者

   arr = [0 for i in range(N)] 

在第一种情况下,数组的所有索引都指向同一个整数对象

在此处输入图像描述

并且当您为特定索引分配值时,会创建一个新的 int 对象,例如arr[4] = 5创建

在此处输入图像描述

现在让我们看看当我们创建一个列表列表时会发生什么,在这种情况下,我们顶部列表的所有元素都将指向同一个列表

在此处输入图像描述

如果您更新任何索引的值,则会创建一个新的 int 对象。但由于所有顶级列表索引都指向同一个列表,所有行看起来都一样。你会感觉到更新一个元素就是更新该列中的所有元素。

在此处输入图像描述

致谢:感谢Pranav Devarakonda在这里的简单解释


推荐阅读