欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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产生影响
    '''

在内存中的实现方式参考下图:
python初识之深浅拷贝

说明在拷贝之后,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]

python初识之深浅拷贝

由上图可看出,对象b对a进行拷贝后,只拷贝了第一层,但是嵌套的列表中元素属于第二层,若对第二层元素进行修改,则第二层元素地址发生改变,此时,对象a的元素就会发生改变 此时就可说明,浅拷贝只拷贝第一层,若修改第二层及以上数据,a对象也会随之修改

深拷贝

#首先需引入copyimport 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]
相关标签: 深浅拷贝 python