【笔记】浅拷贝和深拷贝
浅拷贝和深拷贝浅拷贝:不拷贝子对象的内容,只是拷贝值对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。
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造成影响。
nanaqilin 发表于 2021-6-16 10:36
可不可以这样理解,浅拷贝相当于引用,深拷贝才是真的拷贝
浅拷贝拷贝的是地址,AcopyB,B变了,A跟着变
深拷贝拷贝的是数据,AcopyB,B变了,A不变 浅拷贝就是一个对象里有其他对象时,只能复制子对象的引用(内存地址)
深拷贝就是通过类似的递归的方式,子对象嵌套子对象也能获取其实际的属性(值),而非引用 可不可以这样理解,浅拷贝相当于引用,深拷贝才是真的拷贝 感觉搞懂了浅拷贝和深拷贝的区别,感谢 这个和我们平时手机里的复制有啥区别呢? 学习了,一直对这块不了解 看看天空 发表于 2021-6-16 12:06
浅拷贝就是一个对象里有其他对象时,只能复制子对象的引用(内存地址)
深拷贝就是通过类似的递归的方式, ...
这个图必须点支持 烟花非易冷 发表于 2021-6-16 12:18
这个和我们平时手机里的复制有啥区别呢?
手机里的复制相当于深拷贝吧,毕竟手机里复制完之后在修改不影响之前的数据 第二步在a尾部增加一个对象“5”
不是在b 尾部?
页:
[1]
2