python初识之深浅拷贝
程序员文章站
2022-06-08 14:22:23
...
浅拷贝
使用对象.copy()实现浅拷贝,该对象可以为任意类型,该对象中的元素也可为任意类型,浅拷贝只拷贝第一层
如:
a = ['a', 1, 'b', 2]
b = a.copy() #对列表a进行浅拷贝
b[0]='abc' #修改拷贝后的b中第一层元素a为abc
print(a) #输出打印['a', 1, 'b', 2]
print(b) #['abc', 1, 'b', 2]
'''
从输出打印来看,修改对象b中第一层的字符串a为abc,只有b对象只发生改变
而a对象丝毫不受影响,说明浅拷贝修改第一层数据不会对a产生影响
'''
在内存中的实现方式参考下图:
说明在拷贝之后,b对象的所有元素指向了a中的所有元素的指针,当改变b[0]元素的值为abc后,内存会开辟一块新的内存存放abc,此时,b[0]就指向了abc这一元素的指针,但是a[0]的指针此时并没有任何变化,所以只是对象b的元素发生了改变。
若a中存在嵌套列表或字典,浅拷贝后,对嵌套列表或字典修改后如下:
a = [['a', 'abc'], 1, 'b', 2] #a中存在嵌套列表
b = a.copy() #对其进行浅拷贝
b[0][1] = 123 #对拷贝后的嵌套列表进行操作
#对拷贝后的对象b修改其嵌套的列表后,a和b的元素均发生改变
print(a) #输出结果:[['a', 123], 1, 'b', 2]
print(b) #输出结果:[['a', 123], 1, 'b', 2]
由上图可看出,对象b对a进行拷贝后,只拷贝了第一层,但是嵌套的列表中元素属于第二层,若对第二层元素进行修改,则第二层元素地址发生改变,此时,对象a的元素就会发生改变 此时就可说明,浅拷贝只拷贝第一层,若修改第二层及以上数据,a对象也会随之修改
深拷贝
#首先需引入copy包
import copy
a = [['a', 'abc'], 1, 'b', 2]
b=copy.deepcopy(a) #使用copy.deepcopy(需要拷贝的对象),此时就完成了深拷贝
b[0][1] = 123 #对拷贝后的嵌套列表进行操作
# 从输出结果上可以看到,深拷贝后的对象,不论如何对其元素进行操作,都不会影响对象a,即深拷贝是拷贝所有层
print(a) #输出结果:[['a', 'abc'], 1, 'b', 2]
print(b) #输出结果:[['a', 123], 1, 'b', 2]