如何在不使用numpy的Python中高效创建N×N二维列表?
原生Python创建N×N二维列表的高效方法
你提的这个问题确实是Python初学者很容易踩的坑——可变对象的引用复用问题,我来给你几个完全不依赖numpy的原生解决方案,既高效又符合Python的惯用写法:
1. 列表推导式(推荐)
这是Python里最简洁高效的方式,每次迭代都会创建一个全新的行列表,从根源上避免了引用同一个对象的问题:
N = 3 myMatrix = [[None] * N for _ in range(N)]
原理说明
[None] * N会创建一个包含N个None的新列表,而外层的for _ in range(N)会循环N次,每次都生成一个独立的新行。所以myMatrix里的每个子列表都是独立的可变对象,修改其中一行不会影响其他行。
如果要直接初始化填充值(比如你的i+j需求),还可以一步到位:
N = 3 myMatrix = [[i + j for j in range(N)] for i in range(N)] print(myMatrix) # 输出: [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
2. 嵌套循环手动构建
如果你更倾向于直观的分步逻辑,可以用嵌套循环手动创建每一行,本质和列表推导式一致:
N = 3 myMatrix = [] for _ in range(N): # 每次循环创建一个新的行列表 new_row = [None] * N myMatrix.append(new_row)
之后再进行赋值操作,就不会出现所有行同步修改的问题了。
为什么原写法会出错?
再回顾你最初的错误写法:
myList = [None] * 3 myMatrix = [myList] * 3
这里的[myList] * 3并没有创建3个独立的myList副本,而是把myList这个对象的引用复制了3次。也就是说,myMatrix[0]、myMatrix[1]、myMatrix[2]指向的是同一个列表对象,所以修改任意一个位置的值,其他行都会同步变化——这就是你看到所有行最后都变成[2, 3, 4]的原因。
内容的提问来源于stack exchange,提问作者izza
相关产品推荐
相关产品推荐

