簡介
??python中關(guān)于對象復(fù)制有三種類型:直接賦值西土、淺拷貝和深拷貝,他們既有聯(lián)系又有區(qū)別鞍盗。在python中需了,“類型”屬于“對象”跳昼,“變量”是沒有“類型”的。所有的變量都可以理解是內(nèi)存中一個對象的“引用”援所。所以庐舟,我們需要把“變量”和真正的“內(nèi)存對象”分開欣除。
直接賦值
??在python中賦值語句是建立對象的引用值住拭,而不是復(fù)制對象。因此历帚,python變量更像是指針滔岳,而不是數(shù)據(jù)存儲區(qū)域。因此挽牢,直接賦值其實就是其實就是對象的引用(別名)谱煤。
淺拷貝(copy)
拷貝父對象,不會拷貝對象的內(nèi)部的子對象禽拔,淺拷貝僅僅復(fù)制了容器中元素的地址刘离。
>>> testList = ["a","b","c","d","e"]
>>> testListCopy = testList
>>> testList
['a', 'b', 'c', 'd', 'e']
>>> testListCopy
['a', 'b', 'c', 'd', 'e']
>>> testList.pop(1) ## 刪除testList一個元素
'b'
>>> testList
['a', 'c', 'd', 'e']
>>> testListCopy ## testListCopy也發(fā)生了改變
['a', 'c', 'd', 'e']
深拷貝(deepcopy)
??如果不想出現(xiàn)上面的情況(testListCopy隨意testList改變而改變),需要使用深拷貝(deepcopy)方法睹栖。
??copy模塊的deepcopy方法可以完全拷貝了父對象及其子對象硫惕。深拷貝不僅僅拷貝了原始對象自身,也對其包含的值進(jìn)行拷貝野来,它會遞歸的查找對象中包含的其他對象的引用恼除,來完成更深層次拷貝。因此曼氛,深拷貝產(chǎn)生的副本可以隨意修改而不需要擔(dān)心會引起原始值的改變豁辉。
>>> from copy import deepcopy ## 導(dǎo)入copy模塊
>>> testList = ["a","b","c","d","e"]
>>> testListDeepCopy = deepcopy(testList)
>>> testList
['a', 'b', 'c', 'd', 'e']
>>> testListDeepCopy
['a', 'b', 'c', 'd', 'e']
>>> testList.pop(0) ## 刪除testList中的元素
'a'
>>> testList.pop(1)
'c'
>>> testList
['b', 'd', 'e']
>>> testListDeepCopy ## testListDeepCopy沒有發(fā)生改變
['a', 'b', 'c', 'd', 'e']
參考鏈接
理解python里的賦值、引用舀患、拷貝及作用域徽级、內(nèi)存管理、垃圾回收