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

请解释给定Python代码输出为[1,[-1]]而非[1,[2]]的原因

Python列表浅拷贝引发的嵌套元素同步修改问题

问题复现

运行如下代码:

x = [1, [2]]
y = list(x)
x[0] = -1
x[1][0] = -1
print(y)

预期输出为[1, [2]],实际运行输出为[1, [-1]]。

原因说明

核心问题是list(x)执行的是浅拷贝,不是深拷贝:

  • 浅拷贝只会新建最外层的列表容器,直接复制原列表最外层元素的内存引用,不会递归复制原列表里嵌套的可变对象。

逐行拆解执行过程就能看清差异:

  1. 初始化x时,列表x存储两个元素的内存引用:第一个是不可变类型整数1,第二个是可变类型的嵌套列表[2]。
  2. 执行y = list(x)时,系统创建了全新的列表对象y,但y中存储的元素引用完全复制自x:
  • y的第一个元素和x的第一个元素指向同一个整数对象1
  • y的第二个元素和x的第二个元素指向内存中同一个嵌套列表对象,没有为y单独生成新的内层列表
  1. 执行x[0] = -1时,由于整数是不可变类型,该操作本质是给x的第0位重新绑定了新整数-1的引用,这个改动只作用于x本身,y的第0位仍然指向原来的整数1,因此这部分y没有变化。
  2. 执行x[1][0] = -1时,操作是原地修改x和y共同指向的那个嵌套列表的内部元素:列表是可变对象,原地修改不会生成新对象,因此所有指向这个嵌套列表的引用(包括y[1])都会感知到这次改动,最终y的嵌套列表里的值变成了-1。

如果需要让y完全独立于x的后续修改,需要执行深拷贝,使用copy模块的deepcopy()方法,递归复制所有层级的嵌套对象,让x和y的所有元素都指向完全独立的内存对象,就不会出现修改互相影响的问题。

内容的提问来源于stack exchange,提问作者sachin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:22:01