You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:10:31