前言
最近学习python中的字典的时候遇到字典中的一个内置bif,它可以拷贝字典,但是有意思的是copy模块中也提供了一个方法拷贝字典,还有最简单的赋值也可以拷贝字典,那么这三者有什么区别呢,本文将简单讲解这一问题。
正文
-
赋值法:
这个就很懒了,人家改都不改,直接拿拷贝的引用指向的被拷贝的字典对象的内存空间。结果就是拷贝的字典一修改,原来的字典也被改了。
我们看下代码示例:>>> d1 = {'author':'lz','age':19} >>> d2 = d1 >>> d1 {'author': 'lz', 'age': 19} >>> d2 {'author': 'lz', 'age': 19} >>> d2['author'] = 'Mogu134' >>> d1 {'author': 'Mogu134', 'age': 19} >>> d2 {'author': 'Mogu134', 'age': 19}
-
深拷贝(deepcopy)
我们先来看deepcopy,这个货是和上面那个完全相反的,它直接递归拷贝所有数据,相当于完全在另外内存中新建原字典,不管是引用也好,数值也罢,它都全拷了,简直就是劳模。 -
浅拷贝(shallow copy)
终于到了主角,这货是个中间派,它拷东西喜欢拷一半,字典中的元素它都拷,但是如果元素是个对象,他就要考虑考虑了,最后还是只拷人家的引用,数值就不管了。
我们来看看它和深拷贝拷贝的引用的id就明白一切了:
>>> import copy
>>> d1 = {'author':'Mogu134','age':[19,20]}
>>> d2 = copy.deepcopy(d1)
>>> d3 = d1.copy()
>>> id(d1['age'])
1986229812160
>>> id(d2['age'])
1986229875264
>>> id(d3['age'])
1986229812160
看见没有,浅拷贝这货偷懒,碰到列表对象就直接拿人家的过来用了,id都是一样的,而深拷贝这货勤勤恳恳直接在内存开辟了一块新的地址空间。
下面这两张图就很好地说明了这个:
总结
这是个没有总结的总结,赋值这货吧,就是最偷懒的,其次是浅拷贝,最勤快的是深拷贝;赋值拷贝的是字典的引用,浅拷贝拷贝对象引用,而不拷对象数值,深拷贝全拷,管你是什么。