You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:45:42