You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

为何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

火山引擎 最新活动