Python 更改二维数组元素的值将更改整个列

Python 更改二维数组元素的值将更改整个列,python,performance,numpy,while-loop,optics-algorithm,Python,Performance,Numpy,While Loop,Optics Algorithm,当我打印我的arr值时,我得到了2D数组的正确值,但当我退出while循环时,我的值都是错误的 我不确定我做错了什么 #num运行 n=4 x=np.linspace(-1,1,n) y=np.linspace(-1,1,n) x1,y1=np.网格(x,y) l=np.linspace(01000,n) x=np.linspace(-1,1,n) p1,p2=np.网格(l,l) w020=5*(y1**2+x1**2) 行,列=(n,n) arr=[[0]*列]*行 i=0 p=0 而i

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

我不确定我做错了什么

#num运行
n=4
x=np.linspace(-1,1,n)
y=np.linspace(-1,1,n)
x1,y1=np.网格(x,y)
l=np.linspace(01000,n)
x=np.linspace(-1,1,n)
p1,p2=np.网格(l,l)
w020=5*(y1**2+x1**2)
行,列=(n,n)
arr=[[0]*列]*行
i=0
p=0
而i
创建二维阵列的方式会创建一个浅列表

    arr = [[0]*cols]*row
相反,如果要更新列表中的元素,应该使用

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

说明

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

   arr = [0]*N 

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

当您为特定索引赋值时,将创建一个新的int对象,例如
arr[4]=5
creates

现在让我们看看创建列表列表时会发生什么,在本例中,我们的顶级列表的所有元素都将指向同一个列表

如果更新任何索引的值,将创建一个新的int对象。但由于所有顶级列表索引都指向同一个列表,因此所有行的外观都相同。您会觉得更新一个元素就是更新该列中的所有元素


学分:感谢您的简单解释

您能解释一下您对arr的期望值吗?当我打印我的arr[I-1][p]while循环中的值我得到我期望的值,4次运行的值为4.0 0.12061475842817959 0.12061475842817959 4.0 0.12061475842817959 3.5320886237954 3.53208862379562 0.12061475842817959 0.120614758428179593.53208862379562 3.53208888623796 0.12061475842817959 4.0 0.12061475842817959 0.12061475842817959 4.0但当循环完成,我绘制并打印我的数组时,我不会为我的数组元素获取这些值。我运行了您的代码,值如您所需,最终的数组是“``[[4.0,0.1206147475842817959,0.12061475842817959,4.0],[4.0,0.12061475842817959,0.12061475842817959,4.0],[4.0,0.12061475842817959,0.12061475842817959,4.0],[4.0,0.1206147475842817959,0.12061475842817959,4.0]``在循环内,arr[1]的数组值如下[0.1206147475842817959 3.5320886237953.53208888627962.12088627959]在循环外部,我的值会更改为您提到的值。如果您在循环内部打印正在计算的值,我不确定退出循环时为什么我的值会更改。在循环外部,我的值会更改。
   arr = [0 for i in range(N)]