Python字符串转3×3矩阵异常求助:赋值结果不符合预期
问题分析与解决
你的代码问题出在矩阵初始化的方式上:
matrix = [[0]*3]*3
这行代码并没有创建3个独立的长度为3的子列表,而是让外层列表的3个元素全部指向同一个[0,0,0]列表对象。也就是说,matrix[0]、matrix[1]、matrix[2]其实是同一个列表的引用。
当你通过双层循环赋值时,每次修改matrix[i][j]本质上都是在修改那个唯一的子列表。第一次循环(i=0)把它改成['A','B','C'],第二次循环(i=1)改成['D','E','F'],第三次循环(i=2)改成['G','H','I'],最终三个“子列表”因为指向同一个对象,所以输出全是['G','H','I']。
修正方案
把矩阵初始化改成创建独立子列表的方式,比如用列表推导式:
input_str = "ABCDEFGHI" # 避免用input作为变量名,它是Python内置函数 # 正确初始化3×3矩阵,每个子列表都是独立对象 matrix = [[0 for _ in range(3)] for _ in range(3)] index = 0 for i in range(3): for j in range(3): matrix[i][j] = input_str[index] index += 1 print(matrix)
运行后就能得到预期的[['A','B','C'],['D','E','F'],['G','H','I']]。
更简洁的实现方式
你也可以直接利用字符串切片来生成矩阵,不需要循环赋值:
input_str = "ABCDEFGHI" matrix = [list(input_str[i*3 : (i+1)*3]) for i in range(3)] print(matrix)
这种方式更高效,也避免了初始化时的引用问题。
内容的提问来源于stack exchange,提问作者Jacky Liu
相关产品推荐
相关产品推荐

