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

关于Python shallow copy:Python官方文档是否存在错误?

疑问:是我理解错了,还是Python官方文档有错误?

在Python官方教程的列表章节末尾,有关于列表复制的如下描述:

Python中的简单赋值从不复制数据。将列表赋值给变量时,变量指向现有列表。通过一个变量对列表所做的任何更改,都会反映在所有指向该列表的其他变量上:

>>> rgb = ["Red", "Green", "Blue"]
>>> rgba = rgb
>>> id(rgb) == id(rgba)  # 它们引用同一个对象,结果为True
>>> rgba.append("Alph")
>>> rgb  # 输出:["Red", "Green", "Blue", "Alph"]

我理解新变量是原列表的引用,但文档紧接着说明:

所有切片操作都会返回一个包含请求元素的新列表。这意味着以下切片会返回列表的浅拷贝(shallow copy):

>>> correct_rgba = rgba[:]
>>> correct_rgba[-1] = "Alpha"

>>> correct_rgba  # 输出:["Red", "Green", "Blue", "Alpha"]

>>> rgba  # 输出:["Red", "Green", "Blue", "Alph"]

我的理解:

  • rgba[:]是切片操作
  • 它生成原列表的浅拷贝
  • 它将原列表的数据复制到一个不指向原列表的新列表中

但我有困惑:

  • 看完浅拷贝与深拷贝的区别文档后,我以为浅拷贝是原对象的引用,而深拷贝是完全独立的无引用副本
  • 但上面的示例里,切片生成的副本修改后不影响原列表,看起来像是深拷贝,却被标注为浅拷贝?

你没理解错,文档也没问题,问题出在你对“浅拷贝”的定义理解偏差了。

先明确几个核心概念:

  • 引用赋值:像rgba = rgb这种操作,只是给同一个列表对象多绑定了一个变量名,两个变量指向完全相同的内存地址,修改其中一个,另一个必然同步变化。
  • 浅拷贝:比如rgba[:],会创建一个全新的列表对象,但这个新列表里的元素,仍然是原列表元素的引用。如果原列表的元素是不可变类型(比如字符串、数字),修改新列表的元素时,因为不可变类型会生成新对象,所以看起来和原列表完全独立;但如果原列表包含可变元素(比如子列表),修改新列表里的可变元素,原列表的对应元素也会跟着变化。

举个直观的例子:

>>> original = ["a", ["b", "c"]]
>>> shallow_copy = original[:]
>>> shallow_copy[0] = "x"  # 修改不可变元素
>>> original  # 原列表不受影响:["a", ["b", "c"]]
>>> shallow_copy[1].append("d")  # 修改可变元素
>>> original  # 原列表同步变化:["a", ["b", "c", "d"]]

而深拷贝会递归复制所有层级的元素,不管原列表里的元素是可变还是不可变,新列表和原列表完全独立,任何修改都不会互相影响。

回到教程的示例,因为列表里的元素都是字符串(不可变类型),所以浅拷贝的表现和深拷贝一致,但本质还是浅拷贝——只是因为元素不可变,才没表现出共享引用的特性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:33