Python生成行列乘积矩阵结果异常的问题及解决方法
解决Python中列表嵌套创建矩阵的引用问题
哈哈,这个坑我当初刚学Python的时候也踩过!你遇到的问题核心在于列表乘法的引用机制,咱们来一步步拆解:
为什么原来的代码会出错?
你写的 test = [[0] * (10)] * 10 看起来是创建了10行10列的矩阵,但实际上:
- 内层的
[0] * 10确实创建了一个包含10个0的列表; - 但外层的
*10并没有生成10个独立的新列表,而是把同一个列表的引用复制了10次。
也就是说,test[0]、test[1]……test[9] 其实指向的是内存中同一个列表对象。所以你在循环里修改 test[i][j] 时,本质上是在修改那个唯一的列表,最后循环到 i=9 时,所有行都被覆盖成了最后一次的计算结果。
正确的实现方法
这里给你几种靠谱的写法:
方法1:用列表推导式创建独立行
先创建每行都是独立列表的矩阵,再进行赋值:
# 用列表推导式生成10个独立的行,每行都是新的[0]*10列表 test = [[0] * 10 for _ in range(10)] for i in range(10): for j in range(10): test[i][j] = i * j
这里的 for _ in range(10) 会循环10次,每次都生成一个新的 [0]*10 列表,所以每行都是独立的,不会共享引用。
方法2:一步到位的列表推导式(更简洁)
直接把初始化和赋值合并,连循环都不用写:
test = [[i * j for j in range(10)] for i in range(10)]
这个写法会直接生成每行都是 i*j 结果的矩阵,效率更高,代码也更简洁。
方法3:用循环逐行创建
如果你更喜欢显式的循环写法,也可以这样:
test = [] for i in range(10): # 每次循环生成新的行列表 row = [0] * 10 for j in range(10): row[j] = i * j test.append(row)
验证结果
现在你再打印 test,就能得到预期的行列乘积矩阵了:
- 第0行全是0(0乘以任何数都是0);
- 第1行是
[0,1,2,...,9]; - ...
- 第9行是
[0,9,18,...,81]。
内容的提问来源于stack exchange,提问作者calmira
相关产品推荐
相关产品推荐

