參考
python中的深拷貝和淺拷貝問題
python的復(fù)制社痛,深拷貝和淺拷貝的區(qū)別
結(jié)論
總體來說胀蛮,賦值只是增加了一個對象的引用蹂析,它們指向內(nèi)存中的同一個對象葛碧;淺拷貝會開辟新內(nèi)存將對象拷貝一份借杰,但是不會拷貝子對象;深拷貝會開辟新內(nèi)存將對象拷貝后进泼,連帶子對象也拷貝蔗衡,與原對象完全獨(dú)立纤虽。
示意圖
代碼示意
1逼纸、賦值
>>> a = [1,2,3,[4,5]]
>>> b = a # 通常的賦值操作
>>> a
[1, 2, 3, [4, 5]]
>>> b
[1, 2, 3, [4, 5]]
>>> b[0] = 111 # 將b[0]由1變?yōu)?11
>>> a # 結(jié)果顯示a[0]和b[0]一起都改變了
[111, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 5]]
>>> b[3][1] = 444 # 將b[3][1]由5變?yōu)?44
>>> a
[111, 2, 3, [4, 444]] # 結(jié)果依然是a[3][1]和b[3][1]一起都改變了
>>> b
[111, 2, 3, [4, 444]]
從上述代碼中可以看出:這里只是傳遞對象的引用而已,a和b指向的是同一個對象济蝉。原始列表改變杰刽,被賦值的b也會做相同的改變。
2王滤、淺拷貝
>>> import copy
>>> a = [1,2,3,[4,5]]
>>> b = copy.copy(a)# b為a的淺拷貝
>>> a
[1, 2, 3, [4, 5]]
>>> b
[1, 2, 3, [4, 5]]
>>> b[0]=111 # 將b[0]由1變?yōu)?11
>>> a # 結(jié)果顯示a[0]并沒有變贺嫂,但b[0]變成了111
[1, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 5]]
>>> b[3][1]=444 # 將b[3][1]由5變?yōu)?44
>>> a # 結(jié)果顯示a[3][1]和b[3][1]都變了
[1, 2, 3, [4, 444]]
>>> b
[111, 2, 3, [4, 444]]
從上述代碼中可以看出:b指向的是a的淺拷貝對象,沒有拷貝子對象雁乡,所以a和b的子對象是相同的引用涝婉。如果我們改變b中的對象,對a不會造成影響蔗怠;如果改變了b的子對象墩弯,則a和b對應(yīng)的子對象都會改變。
3寞射、深拷貝
>>> import copy
>>> a = [1,2,3,[4,5]]
>>> b = copy.deepcopy(a)# b為a的深拷貝
>>> a
[1, 2, 3, [4, 5]]
>>> b
[1, 2, 3, [4, 5]]
>>> b[0]=111 # 將b[0]由1變?yōu)?11
>>> a # 結(jié)果顯示a[0]沒有變渔工,b[0]變?yōu)?11,與淺拷貝結(jié)果一樣
[1, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 5]]
>>> b[3][1]=444 # 將b[3][1]由5變?yōu)?44
>>> a # 結(jié)果顯示a[3][1]沒變桥温,b[3][1]都變?yōu)?44引矩,與淺拷貝結(jié)果不一樣
[1, 2, 3, [4, 5]]
>>> b
[111, 2, 3, [4, 444]]
從上述代碼可以看出:兩個對象 a 和 b 相互獨(dú)立。b指向a的深拷貝對象侵浸,包含a中的子對象的拷貝旺韭,所以對b進(jìn)行改變不會造成a中任何元素的改變。
結(jié)尾
如果您發(fā)現(xiàn)我的文章有任何錯誤掏觉,或?qū)ξ业奈恼掠惺裁春玫慕ㄗh区端,請聯(lián)系我!如果您喜歡我的文章澳腹,請點(diǎn)喜歡~*我是藍(lán)白絳织盼,感謝你的閱讀!