python - 更改二维数组元素的值会更改整个列
问题描述
当我打印我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)
解决方案
您创建二维数组的方式创建了一个浅列表
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在这里的简单解释
推荐阅读
- html - 我可以在带有输入的标签内选择 ::after 吗?
- python - 预处理文本以输入在 imdb 数据集上训练的模型
- wolfram-mathematica - 求解 6 个不工作的变量的 6 个非线性方程
- python - python - 如何定义一个创建与python相互嵌入的for循环的函数?
- python - 如何使用从 cvxopt.solvers 获得的参数绘制非线性决策边界?
- perl - Perl 在第二个元素后加入数组
- python - 用于查找子字符串的正则表达式
- angular - Angular 无法使用可观察的服务调用方法
- python - ttk Progressbar 使用 grid vs pack 的问题
- r - 在 R 中使用 sapply 函数时,如何维护小标题的名称列表?