Python中用[[None]*col]*row创建矩阵赋值异常,求原因
二维矩阵创建时赋值异常的原因及解决方法
问题重现
以下代码尝试创建2行3列的矩阵并赋值,但实际输出与预期不符:
row, col = 2, 3 mat1 = [[None]*col]*row print(mat1) for i in range(0, row): for j in range(0, col): mat1[i][j] = int(input()) print(mat1)
输入:
1 2 3 4 5 6
预期输出:
[[1,2,3], [4,5,6]]
实际输出:
[[4,5,6], [4,5,6]]
原因分析
问题出在矩阵创建语句[[None]*col]*row上:
- 首先
[None]*col会生成一个包含col个None的列表对象; - 随后
*row是把这个唯一的列表对象重复row次,添加到外层列表中。
这意味着外层列表的所有元素都指向同一个内存地址的子列表。当你通过mat1[i][j]赋值时,本质是在修改那个共享的子列表,最终所有行都会显示最后一次修改的结果。
可以通过打印子列表内存地址验证:
row, col = 2, 3 mat1 = [[None]*col]*row print(id(mat1[0])) # 输出某一内存地址 print(id(mat1[1])) # 输出与上面完全相同的地址
解决方案
需要为每一行创建独立的列表对象,常用两种方式:
方式1:列表推导式(推荐)
row, col = 2, 3 mat1 = [[None for _ in range(col)] for _ in range(row)] # 后续赋值代码不变 for i in range(row): for j in range(col): mat1[i][j] = int(input()) print(mat1)
方式2:循环逐行创建
row, col = 2, 3 mat1 = [] for _ in range(row): mat1.append([None]*col) # 每次append新的列表对象 # 后续赋值代码不变 for i in range(row): for j in range(col): mat1[i][j] = int(input()) print(mat1)
两种方式都会为每一行生成独立的列表,赋值时各行互不影响,最终能得到预期的输出结果。
内容的提问来源于stack exchange,提问作者randomname
相关产品推荐
相关产品推荐

