Python实现5x5二维数组乘法表输出重复结果问题排查
问题背景
编写代码尝试生成5x5规格的二维数组乘法表,运行后始终得到重复的0 4 8 12 16输出,无法得到预期结果,原始代码如下:
#make a 2-d array that's a 5x5 multiplication table rows, cols = (5, 5) my_multiplication_array = [[0]*rows]*cols for i in range(rows): for j in range(cols): my_multiplication_array[i][j] = i*j for i in range(rows): for j in range(cols): print(my_multiplication_array[i][j], end="") print(" ", end="") print()
错误根源
核心问题出在二维数组的初始化语句my_multiplication_array = [[0]*rows]*cols:
- 对列表使用乘法
*做复制时,复制的是元素的引用而非独立对象。[0]*rows能正常生成一维全0列表,是因为整数是不可变类型,不存在引用修改问题;但外层的*cols是把存储了5个整数的子列表的引用复制了cols次,最终生成的二维列表里的5个子列表,全部指向内存里的同一个列表对象。 - 循环赋值时,无论修改哪一行的元素,本质都是修改这个唯一的共享子列表。当外层循环走到最后一轮
i=4时,子列表的元素会被依次赋值为4*0=0、4*1=4、4*2=8、4*3=12、4*4=16,循环结束后所有行都指向这组值,因此打印时每一行输出完全一致。
修正方案
替换二维数组的初始化逻辑,用列表推导式生成互相独立的子列表,保证各行内存地址互不干扰,修正后代码如下:
#make a 2-d array that's a 5x5 multiplication table rows, cols = (5, 5) # 用列表推导式生成cols个独立的全0子列表 my_multiplication_array = [[0]*rows for _ in range(cols)] for i in range(rows): for j in range(cols): my_multiplication_array[i][j] = i*j for i in range(rows): for j in range(cols): print(my_multiplication_array[i][j], end="") print(" ", end="") print()
运行后可得到符合代码逻辑的正确乘法表输出:
0 0 0 0 0 0 1 2 3 4 0 2 4 6 8 0 3 6 9 12 0 4 8 12 16
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

