Python两次调用函数时首次返回列表覆盖第二次传入零矩阵如何解决
问题原因
- 核心错误是可变对象的引用重复绑定:你在初始化矩阵的循环里,每轮只创建了1个
b列表,然后同时把这个b追加给了a、c、result三个矩阵。Python中列表是可变引用类型,这就导致三个矩阵的每一行都指向同一个内存地址的列表,修改任意一个矩阵的元素,另外两个都会同步变化。 - 你第一次调用
entery(n,a)修改a的元素时,c和result的元素已经被同步修改,所以第二次调用传入的c已经不是初始的零矩阵,等于你两次输入都修改了同一个内存的列表值,最后fm和sm指向的是同一个矩阵。
修复方案
初始化矩阵时,每个矩阵单独创建独立的子列表,不要复用同一个b对象即可解决问题。
可以直接把原来的初始化逻辑替换为更简洁的列表推导式:
a = [[0]*n for _ in range(n)] c = [[0]*n for _ in range(n)] result = [[0]*n for _ in range(n)]
如果要保留原循环写法,就给每个矩阵单独写初始化循环:
# 创建a矩阵 a = [] for i in range(n): b =[] for j in range(n): b.append(0) a.append(b) # 创建c矩阵 c = [] for i in range(n): b =[] for j in range(n): b.append(0) c.append(b) # 创建result矩阵 result = [] for i in range(n): b =[] for j in range(n): b.append(0) result.append(b)
额外优化点:entery函数不需要写return逻辑,因为传入的列表是可变对象,函数内修改会直接作用到原对象上,保留return也不会影响运行,只是没有必要。
修复后效果
输入n=2,第一次输入11、22、33、44赋值给a矩阵,第二次输入12、23、34、45赋值给c矩阵,最终相加结果会是[[23, 45], [67, 89]],符合矩阵加法的预期逻辑。
内容的提问来源于stack exchange,提问作者Ashutosh Sharma
相关产品推荐
相关产品推荐

