Python变量接收矩阵运算结果时出现的简单怪异Bug咨询
Bug原因分析
核心问题是变量赋值顺序错误,后续旋转计算误用了已经修改的新值而非原始值:
- Print1阶段的三次打印,所有旋转计算的输入都是初始定义的未修改的
x/y/z,输入统一所以输出符合预期。 - 赋值阶段的逻辑存在顺序依赖问题:
- 第一行赋值
x = (rot_y@rot_x@(np.array([x, y , z ])))[0]时,输入的x/y/z还是初始值,所以得到的新x和Print1的结果一致。 - 第二行赋值
y = (rot_y@rot_x@(np.array([x, y , z ])))[1]时,输入的x已经是上一步赋值的新值,但由于rot_y@rot_x的第二行第一个元素为0,x的数值变化不会影响第二行的输出结果,因此得到的新y刚好和Print1的结果一致,掩盖了逻辑错误。 - 第三行赋值
z = (rot_y@rot_x@(np.array([x, y , z ])))[2]时,输入的x和y都已经替换为前两步计算出的新值,而rot_y@rot_x的第三行第一、第二列元素均不为0,输入参数已经和Print1阶段完全不同,因此输出结果出现偏差。
- 第一行赋值
修复方案
一次性完成旋转计算后再赋值,避免中途修改输入参数:
# 先统一用原始值计算全部旋转结果 rotated_arr = rot_y @ rot_x @ np.array([x, y, z]) # 再分别赋值 x = rotated_arr[0] y = rotated_arr[1] z = rotated_arr[2]
修改后两次打印的结果就会完全一致。
内容的提问来源于stack exchange,提问作者Hangci Du
相关产品推荐
相关产品推荐

