为何Python中该二维列表输入会所有行均取最后一次输入为元素?
问题原因分析
你遇到的这个问题,核心在于Python中列表乘法的引用特性。咱们拆解一下你创建二维列表的代码:
a=[[0]*int(n)]*int(m)
当你用[x] * k这种方式创建列表时,Python并不会生成k个独立的x副本,而是创建k个指向同一个x对象的引用。在这里,[0]*int(n)先生成了一个包含n个0的列表,然后*int(m)只是把这个列表的引用重复了m次——也就是说,你的二维列表a里的每一行,其实都是同一个列表对象。
所以当你在循环里给a[i][j]赋值时,你实际上一直在修改那个唯一的底层列表。最后一次循环(输入31-34的那行)覆盖了之前所有的修改,自然所有行都会显示成最后一行的内容。
解决方法
要创建真正独立的多行二维列表,得确保每一行都是全新的列表对象,这里给你两种常用的正确写法:
方法1:列表推导式(推荐)
这是Python里创建二维列表最简洁且安全的方式:
m, n = input().split() m = int(m) n = int(n) a = [[0]*n for _ in range(m)] # 每一行都是新生成的[0]*n列表
方法2:循环逐行创建
如果你更喜欢显式的循环逻辑,也可以这样写:
m, n = input().split() m = int(m) n = int(n) a = [] for _ in range(m): a.append([0]*n)
修改后的完整代码示例:
m, n = input().split() m = int(m) n = int(n) a = [[0]*n for _ in range(m)] for i in range(m): s = input().split() for j in range(n): a[i][j] = int(s[j]) print(a)
运行这段代码,输入你指定的内容后,就能得到正确的结果:[[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]]。
内容的提问来源于stack exchange,提问作者Peter W




