python - 为什么 Python List 的不同初始化会为矩阵乘法提供不同的输出
问题描述
我试图进行矩阵乘法,同时使用快捷方法初始化列表,即 C[[0]*column]*row。该列表已按照我的意愿进行了初始化,但它给了我错误的答案。之后我尝试使用 for 循环初始化代码,它给了我正确的答案。请帮助我了解此 python 列表行为背后的原因。
这是我的代码:
A = [[1,2],[3,4]]
B = [[5,6,],[7,8]]
C = []
for i in range(2):
c = []
for j in range(2):
c.append(int(0))
C.append(c)
D = [[int(0)]*2]*2
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
C[i][j] += A[i][k] * B[k][j]
D[i][j] += A[i][k] * B[k][j]
for r in C:
print(r)
print(D)
这是我的输出:
[[19, 22],[43, 50]]
[[62, 72], [62, 72]]
解决方案
原因可能是,在执行列表相乘的“快捷方法”时,Python 不会对列表进行深层复制。看这个例子:
d = [ 5 * [2] ] * 3
>> [[2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2]]
d[0][0] = 1
>> [[1, 2, 2, 2, 2], [1, 2, 2, 2, 2], [1, 2, 2, 2, 2]]
看起来我正要修改元素 [0][0] 但实际上其他行只是引用第一行 - 所以我更改了三行而不是一个。
请考虑使用numpy进行矩阵计算:)
推荐阅读
- google-apps-script - G Suite:删除 Chromebook 中的本地用户个人资料
- jquery - jQuery 验证电话号码前缀只有 3 个号码 (059)
- android - 带有 32 位 dll 的 Play 商店 64 位 apk
- javascript - 当另一个数组有一个数字(值)时如何匹配2个数组的字符串值
- excel - 获取数据表的切片器选择
- java - HorizontalScrollView scrollTo 不会滚动到视图的原始宽度之上
- web-scraping - Cheerio:将多个搜索组合在一起
- php - laravel 路由在 IP 地址上不起作用
- c# - 如何使用 asp-for TagHelper 结合反射
- c# - EntityFramework 更新在 SaveChanges / ASP.NET MVC / postbacks 上随机失败