Python中用*运算符创建列表时元素赋值不符合预期问题咨询
Python列表乘法
*的引用陷阱 先复现问题中的代码:
>>> m=[[-1]*2]*2 >>> n=[[-1,-1],[-1,-1]] >>> m==n True >>> for i in range(2): ... m[i][i]=10 ... >>> m [[10, 10], [10, 10]] >>> for i in range(2): ... n[i][i]=10 ... >>> n [[10, -1], [-1, 10]]
原因解释
这就是使用*运算符创建嵌套列表时的典型陷阱,跟Python 3.10.0版本无关,所有Python 3.x版本都存在这个特性:
- 对于
m=[[-1]*2]*2:首先创建了一个子列表[-1, -1],然后*2操作是把这个子列表的引用重复两次,添加到外层列表中。也就是说m[0]和m[1]指向的是内存里的同一个列表对象。所以无论修改m[0]还是m[1],本质上都是在修改同一个底层列表,最终两个子列表都会同步变化。 - 对于
n=[[-1,-1],[-1,-1]]:这里是手动创建了两个完全独立的子列表,n[0]和n[1]是内存中两个不同的对象,修改其中一个不会影响另一个,因此赋值结果符合预期。
验证引用一致性
可以用id()函数查看内存地址,直观确认这一点:
>>> m = [[-1]*2]*2 >>> id(m[0]) == id(m[1]) # 两个子列表是同一个对象 True >>> n = [[-1,-1],[-1,-1]] >>> id(n[0]) == id(n[1]) # 两个子列表是不同对象 False
内容的提问来源于stack exchange,提问作者user17144
相关产品推荐
相关产品推荐

