Python 2.7二维列表赋值异常求助:输入与输出不符问题
问题分析与解决
嘿,这个坑我刚学Python的时候也踩过!咱们来一步步拆解问题出在哪:
核心问题:[[0]*n]*n的陷阱
你创建二维列表的这行代码:
a = [[0]*n]*n
看起来是生成了n个长度为n的列表,但实际上它只是创建了一个列表对象,然后把这个对象的引用重复了n次。也就是说,a[0]、a[1]、a[2]其实指向的是同一个列表。所以当你在循环里修改a[i][j]的时候,所有行的对应位置都会被修改——因为它们本质上是同一个列表!
这就是为什么最后输出的三行全是最后一次输入的101对应的[1, 0, 1]:前面两次输入的101和010其实都被最后一次的赋值覆盖了,所有行同步变化。
修复方案:创建独立的子列表
把创建二维列表的代码改成列表推导式,这样每一行都是独立的新列表:
n = int(raw_input()) # 用列表推导式生成n个独立的子列表 a = [[0]*n for _ in xrange(n)] for i in xrange(0,n): s = raw_input() for j in xrange(0,n): a[i][j] = int(s[j]) print a
这个写法里,for _ in xrange(n)会循环n次,每次都生成一个新的[0]*n列表,所以a的每一行都是完全独立的对象,修改其中一行不会影响其他行。
现在再输入3、101、010、101,输出就会是你预期的:
[[1, 0, 1], [0, 1, 0], [1, 0, 1]]
额外提醒
顺便提一句,Python 2.7已经在2020年停止官方维护了,如果你之后有新的项目,建议升级到Python 3.x版本,它有更多新特性和更完善的支持哦~
内容的提问来源于stack exchange,提问作者Vaibhav Gupta
相关产品推荐
相关产品推荐

