吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1857|回复: 13
收起左侧

[Python 转载] 【笔记】浅拷贝和深拷贝

[复制链接]
cccyyys 发表于 2021-6-16 10:10
浅拷贝和深拷贝
浅拷贝:不拷贝子对象的内容,只是拷贝值对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。
[Python] 纯文本查看 复制代码
import copy  #引入copy模块def testcopy():
    '''测试浅拷贝'''
    a = [10,20,[5,6]]
    b = copy.copy(a)
    print('a:',a)
    print('b:',b)
    b.append(30)
    b[2].append(5)
    print('浅拷贝后.....')
    print(a)
    print(b)
    print(id(a[2]))
    print(id(b[2]))

testcopy()

测试结果为:a: [10, 20, [5, 6]]
b: [10, 20, [5, 6]]
浅拷贝后.....
[10, 20, [5, 6, 5]]
[10, 20, [5, 6, 5], 30]
2012720260864
2012720260864
从结果我们可以看出,因为浅拷贝只是拷贝值对象的引用,函数运行完毕之后,a和b的值都发生了变化,首先将“10”,”20”,”[5,6]”这三个对象的地址赋给了a,然后b拷贝a,生成了一个新的地址,并且将“10”,”20”,”[5,6]”这3个对象分别指向b,第一步先是在b尾部加一个对象“30”,因为b和a内存地址不同,所以a不会发生变化,第二步在a[2]尾部增加一个对象“5”,而a和b中的a[2]都是指向一个地址,在a[2]中增加对象同样也会对a有效,因此a的值就会变成[10, 20, [5, 6, 5]]。
[Python] 纯文本查看 复制代码
import copy  #引入copy模块
def testdeepcopy():
    '''测试深拷贝'''
    a = [10,20,[5,6]]
    b = copy.deepcopy(a)
    print('a:',a)
    print('b:',b)
    b.append(30)
    b[2].append(5)
    print('深拷贝后.....')
    print(a)
    print(b)
    print(id(a[2]))
    print(id(b[2]))
testdeepcopy()

运行结果为:a: [10, 20, [5, 6]]
b: [10, 20, [5, 6]]
深拷贝后.....
[10, 20, [5, 6]]
[10, 20, [5, 6, 5], 30]
2129750002944
2129750002368
这是一个深拷贝,从结果中可以看出,函数运行完毕后,a的值没有变。因为深拷贝会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象,会把a中所有子对象全部拷贝,全部生成新的内存地址,保存下来,这样对b的修改便不会对a造成影响。

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
nanaqilin + 1 + 1 我很赞同!
烟花非易冷 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

joaquinaimar 发表于 2021-6-16 14:23
nanaqilin 发表于 2021-6-16 10:36
可不可以这样理解,浅拷贝相当于引用,深拷贝才是真的拷贝

浅拷贝拷贝的是地址,AcopyB,B变了,A跟着变
深拷贝拷贝的是数据,AcopyB,B变了,A不变
看看天空 发表于 2021-6-16 12:06
浅拷贝就是一个对象里有其他对象时,只能复制子对象的引用(内存地址)
深拷贝就是通过类似的递归的方式,子对象嵌套子对象也能获取其实际的属性(值),而非引用
nanaqilin 发表于 2021-6-16 10:36
可不可以这样理解,浅拷贝相当于引用,深拷贝才是真的拷贝
xy0225 发表于 2021-6-16 12:11
感觉搞懂了浅拷贝和深拷贝的区别,感谢
烟花非易冷 发表于 2021-6-16 12:18
这个和我们平时手机里的复制有啥区别呢?
bhbhxy 发表于 2021-6-16 12:56
学习了,一直对这块不了解
lihu5841314 发表于 2021-6-16 13:16
看看天空 发表于 2021-6-16 12:06
浅拷贝就是一个对象里有其他对象时,只能复制子对象的引用(内存地址)
深拷贝就是通过类似的递归的方式, ...

这个图必须点支持
 楼主| cccyyys 发表于 2021-6-16 18:20
烟花非易冷 发表于 2021-6-16 12:18
这个和我们平时手机里的复制有啥区别呢?

手机里的复制相当于深拷贝吧,毕竟手机里复制完之后在修改不影响之前的数据
QingYi. 发表于 2021-6-17 18:32
第二步在a[2]尾部增加一个对象“5”
不是在b[2] 尾部?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表