Python浅拷贝和深拷贝


目录

  • Python浅拷贝和深拷贝
  • 1.浅拷贝和深拷贝的特点
  • 2.浅拷贝和深拷贝原理
  • 3.浅拷贝和深拷贝操作
  • 3.1 浅拷贝和深拷贝操作的底层逻辑
  • 3.1.1 浅拷贝操作的底层逻辑
  • 3.1.2 深拷贝操作的底层逻辑


1.浅拷贝和深拷贝的特点

使用内置函数:copy(浅拷贝)deepcopy(深拷贝)
浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。

python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝
浅拷贝:拷贝当前个体
深拷贝:拷贝当前个体及其整个家族

2.浅拷贝和深拷贝原理

python深浅拷贝怎么回答 python深浅拷贝原理_开发语言_02

python深浅拷贝怎么回答 python深浅拷贝原理_后端_03


由两幅图对比可以发现,浅拷贝只是拷贝了当前个体,深拷贝则是拷贝当前个体及其整个家族

3.浅拷贝和深拷贝操作

3.1 浅拷贝和深拷贝操作的底层逻辑

变量产生的底层逻辑这里就不详细说明,可参考变量产生的底层逻辑

3.1.1 浅拷贝操作的底层逻辑

python深浅拷贝怎么回答 python深浅拷贝原理_开发语言_04


b = copy.copy(a)python深浅拷贝怎么回答 python深浅拷贝原理_python_05 浅拷贝给 python深浅拷贝怎么回答 python深浅拷贝原理_后端_06

python深浅拷贝怎么回答 python深浅拷贝原理_后端_07


浅拷贝只copy了当前对象个体,不拷贝其后代元素。当前对象个体内各元素依次指向原体的下一层后代。②b.append(30)在复制体 python深浅拷贝怎么回答 python深浅拷贝原理_后端_06 中添加元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_09

python深浅拷贝怎么回答 python深浅拷贝原理_python_10


b[2].append(7)在第一层后代添加元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11

python深浅拷贝怎么回答 python深浅拷贝原理_开发语言_12


b[2]定位到了 python深浅拷贝怎么回答 python深浅拷贝原理_python_13python深浅拷贝怎么回答 python深浅拷贝原理_python_14 共同指向的第二个子元素,即列表元素。b[2].append(7)在列表中添加新元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11

因此执行完b = copy.copy(a)b.append(30)b[2].append(7)后, python深浅拷贝怎么回答 python深浅拷贝原理_python_13 的列表子对象中多了元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11,python深浅拷贝怎么回答 python深浅拷贝原理_python_14 中多了 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_09子对象并且b的列表子对象中多了元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11

简单测试:

python深浅拷贝怎么回答 python深浅拷贝原理_python_21


浅拷贝:自身的复制体(后称"自复体")操作不会影响被复制体自身(后称"自原体"),但通过自复体对后代操作会影响自原体的后代(因为自原体和自复体都指向了共同点的后代)。

3.1.2 深拷贝操作的底层逻辑

python深浅拷贝怎么回答 python深浅拷贝原理_python深浅拷贝怎么回答_22


b = copy.deepcopy(a)python深浅拷贝怎么回答 python深浅拷贝原理_python_05 深拷贝给 python深浅拷贝怎么回答 python深浅拷贝原理_后端_06

python深浅拷贝怎么回答 python深浅拷贝原理_开发语言_25

深拷贝不仅copy了当前对象个体,也拷贝其后代元素。

b.append(30)在复制体 python深浅拷贝怎么回答 python深浅拷贝原理_后端_06 中添加元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_09

python深浅拷贝怎么回答 python深浅拷贝原理_后端_28

b[2].append(7)在第一层后代添加元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11

python深浅拷贝怎么回答 python深浅拷贝原理_python_30

b[2]定位到了自身的第二个子元素,即自身的列表元素。b[2].append(7)在列表中添加新元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11

因此执行完b = copy.copy(a)b.append(30)b[2].append(7)后, python深浅拷贝怎么回答 python深浅拷贝原理_python_13 没有任何变化,python深浅拷贝怎么回答 python深浅拷贝原理_python_14 中多了 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_09子对象并且b的列表子对象中多了元素 python深浅拷贝怎么回答 python深浅拷贝原理_深拷贝_11

简单测试:

python深浅拷贝怎么回答 python深浅拷贝原理_开发语言_36


深拷贝:复制了一整套自身和自身的后代。自身的复制体(后称"自复体")操作不会影响被复制体自身(后称"自原体"),通过自复体对后代操作也不会影响自原体的后代(因为自原体和自复体分别指向自己的后代,互不相干)。