cccyyys 发表于 2021-6-16 10:10

【笔记】浅拷贝和深拷贝

浅拷贝和深拷贝
浅拷贝:不拷贝子对象的内容,只是拷贝值对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。
import copy#引入copy模块def testcopy():
    '''测试浅拷贝'''
    a = ]
    b = copy.copy(a)
    print('a:',a)
    print('b:',b)
    b.append(30)
    b.append(5)
    print('浅拷贝后.....')
    print(a)
    print(b)
    print(id(a))
    print(id(b))

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

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

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尾部增加一个对象“5”
不是在b 尾部?
页: [1] 2
查看完整版本: 【笔记】浅拷贝和深拷贝