百木园-与人分享,
就是让自己快乐。

对python中浅拷贝和深拷贝分析详细介绍

首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变。

  • 不可变:Number(数字)、String(字符串)、Tuple(元组)。
  • 可以变:List(列表)、Dictionary(字典)、Set(集合)。

一.浅拷贝

a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)
浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

#定义一个列表,第一个元素是可变类型>>> A = [[1,2],\'fei\',90]#浅拷贝
>>> B = copy.copy(A)#对象地址是否相同
>>> A is B
False#第一个元素地址是否相同
>>> A[0] is B[0]
True#第二个元素地址是否相同
>>> A[1] is B[1]
True#改变第一个可变类型的值,查看复制对象变化
>>> A[0][0] = 2
>>> A
[[2, 2], \'fei\', 90]#复制对象也跟着改变了
>>> B
[[2, 2], \'fei\', 90]#改变第二个不可变类型的值,查看复制对象变化
>>> A[1] = \'anne\'
>>> A
[[2, 2], \'anne\', 90]#复制对象没有改变
>>> B
[[2, 2], \'fei\', 90]

二.深拷贝

a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。

#深拷贝>>> C = copy.deepcopy(A)#对象地址是否相同
>>> A is C
False#第一个元素地址是否相同
>>> A[0] is C[0]
False#第二个元素地址是否相同
>>> A[1] is C[1]
True#改变第一个元素,查看复制元素变化
>>> A[0][0] = 2
>>> A
[[2, 2], \'fei\', 90]#复制元素不变,对复制元素没影响
>>> C
[[1, 2], \'fei\', 90]
#改变第二个元素,查看复制元素变化
>>> A[1] = \'Anne\' >>> A[[2, 2], \'Anne\', 90]
#复制元素不变,对复制元素没影响
>>> C[[1, 2], \'fei\', 90]

在这里看到一个让我困惑的问题,A is B

三.赋值引用

a 和 b 都指向同一个对象

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
#寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
#赋值引用
>>> A = [[1,2],\'fei\',90]
>>> D = A
#对象地址是否相同
>>> A is D
True
#第一个元素地址是否相同
>>> A[0] is D[0]
True
#第二个元素地址是否相同
>>> A[1] is D[1]
True
#改变A中第一个元素,查看是否影响D
>>> A[0][0] = 2
>>> A
[[2, 2], \'fei\', 90]
#D中第一个元素也跟着改变
>>> D
[[2, 2], \'fei\', 90]
#改变D中第二个元素,查看是否影响A
>>> D[1] = \'anne\'
#A中第二个元素也改变了
>>> A
[[2, 2], \'anne\', 90]
>>> D
[[2, 2], \'anne\', 90]
>>>

在这里插入图片描述

来源:https://www.cnblogs.com/python960410445/p/15240304.html
图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 对python中浅拷贝和深拷贝分析详细介绍

相关推荐

  • 暂无文章