Python中浅拷贝与深拷贝的骚操作
作者:繆斯mius@阿里云Python訓練營
博客地址:https://blog.csdn.net/m0_37759382/article/details/108489108
【例子】淺拷貝與深拷貝中
list1?=?[123,?456,?789,?213] list2?=?list1 list3?=?list1[:] print(list2)?? #?[123,?456,?789,?213] print(list3)?? #?[123,?456,?789,?213] list1.sort() print(list2)?? #?[123,?213,?456,?789]? **print(list3)?? #?[123,?456,?789,?213]** list1?=?[[123,?456],?[789,?213]] list2?=?list1 list3?=?list1[:] print(list2)?? #?[[123,?456],?[789,?213]] print(list3)?? #?[[123,?456],?[789,?213]] list1[0][0]??=?111 print(list2)?? #?[[111,?456],?[789,?213]] **print(list3)?? #?[[111,?456],?[789,?213]]小朋友,你是否有很多問號?????
為什么同樣是list3 = list1[:]
執行list1.sort() 操作,list3不發生變化
執行list1[0][0] ?= 111 操作,list3發生變化
首先我們先了解到python的拷貝有淺拷貝和深拷貝之分
| 1 | Y= X | 直接賦值(淺拷貝) |
| 2 | Z = X [:] | 淺拷貝 |
| 3 | P = copy.copPy(X) | 淺拷貝 |
| 4 | K = copy.deepcopy(X) | 深拷貝 |
接下來我們來探索一下,這些個淺拷貝和深拷貝具體細節上有什么區別呢?
看看這個case
import?copy X?=?[1,3,5,['我','是','第','二','維','度'],9,11] Y=?X?#?直接賦值(淺拷貝) Z?=?X?[:]?#?淺拷貝? P?=?copy.copy(X)??#?淺拷貝? K?=?copy.deepcopy(X)#?深拷貝?#現在我們在X數組的第三個值里面添加一個'哈哈',把里面的是改為不是 X[3].append('哈哈') X[3][1]?=?'不是'#我們打印一下結果瞧一瞧 print("起始列表X為?:?",?X) print("把X列表賦值給Y為?:?",?Y) print("淺拷貝X列表給Z為?:?",?Z) print("淺拷貝X列表給P為?:?",?P) print("深拷貝X列表給K為?:?",?K)輸出結果為:
起始列表X為?:??[1, 3, 5, ['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?9,?11] 把X列表賦值給Y為?:??[1, 3, 5, ['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?9,?11] 淺拷貝X列表給Z為?:??[1, 3, 5, ['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?9,?11] 淺拷貝X列表給P為?:??[1, 3, 5, ['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?9,?11] 深拷貝X列表給K為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]是不是發現深拷貝與淺拷貝的一點點區別啦 ^ . ^只有深拷貝不被更改**!!!**
辣么,我現在想要把X列表的第三值 ['我','是','第','二','維','度'] 改為 7,把最后一個值改為101,看看這些個淺拷貝和深拷貝又是怎么表現的......
import?copy X?=?[1,3,5,['我','是','第','二','維','度'],9,11] Y=?X??#?直接賦值(淺拷貝) Z?=?X?[:]?#?淺拷貝? P?=?copy.copy(X)?#?淺拷貝? K?=?copy.deepcopy(X)#?深拷貝?現在我們修改X數組的第三個值,把最后一個值改為101
X[3]?=?7 X[-1]?=?101我們打印一下結果瞧一瞧
print("起始列表X為?:?",?X) print("把X列表賦值給Y為?:?",?Y) print("淺拷貝X列表給Z為?:?",?Z) print("淺拷貝X列表給P為?:?",?P) print("深拷貝X列表給K為?:?",?K)輸出結果為:
起始列表X為?:??[1, 3, 5, 7, 9, 101]?? 把X列表賦值給Y為?:??[1, 3, 5, 7, 9, 101]?? 淺拷貝X列表給Z為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]?? 淺拷貝X列表給P為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]?? 深拷貝X列表給K為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]??咦!?發現了什么 ?~. ~有的淺拷貝背叛了同胞 ! 和深拷貝的表現是一樣的
結合上面的例子,我們發現,對二維列表中的第一維數據做修改時,使用 = 進行賦值,對X的修改會影響Y,使用 ?[:] , copy.copy() ?, copy.deepcopy() 進行賦值,對X的修改不會影響新的賦值。
如果是對二維列表中的第一維數據做增加或者刪除操作呢?試一試咯
import?copy X?=?[1,3,5,['我','是','第','二','維','度'],9,11] Y=?X??#?直接賦值(淺拷貝) Z?=?X?[:]#?淺拷貝? P?=?copy.copy(X)?#?淺拷貝? K?=?copy.deepcopy(X)#?深拷貝?#在X數組最后添加13,刪除第0個值 X.append(13) X.remove(1)#我們打印一下結果瞧一瞧 print("起始列表X為?:?",?X) print("把X列表賦值給Y為?:?",?Y) print("淺拷貝X列表給Z為?:?",?Z) print("淺拷貝X列表給P為?:?",?P) print("深拷貝X列表給K為?:?",?K)輸出結果為:
起始列表X為?:??[3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11,?13]?? 把X列表賦值給Y為?:??[3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11,?13]?? 淺拷貝X列表給Z為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]?? 淺拷貝X列表給P為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]?? 深拷貝X列表給K為?:??[1, 3, 5, ['我',?'是',?'第',?'二',?'維',?'度'],?9,?11]我們發現,對二維列表中的第一維數據做增加或者刪除操作
同樣是只有使用 = 進行賦值,對X的修改會影響Y
于是乎,我們可以把上面的 修改 擴充為 增刪改 (改也就包括了排序sort()操作喲)
即對二維列表中的第一維數據做 增刪改 操作時,blabla......
你以為這就結束了嗎?
我,第二維數據不想被修改,也不想用深拷貝,怎么辦?
別急,append和 [:] 組合服用就能夠達到深拷貝deepcopy的效果啦 ===>看
輸出結果為:
起始列表X為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說']] 把X列表賦值給Y為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說']] 淺拷貝X列表給Z為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說']] 淺拷貝X列表給P為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說']] 深拷貝X列表給K為?:??**[['我',?'幾',?'維',?'度'],?['我',?'是',?'第',?'二',?'維',?'度'],?['我',?'不',?'說']] 騷操作X列表給TT為?:??**[['我',?'幾',?'維',?'度'],?['我',?'是',?'第',?'二',?'維',?'度'],?['我',?'不',?'說']]由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
總結
以上是生活随笔為你收集整理的Python中浅拷贝与深拷贝的骚操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这样的奇技淫巧不可取,切记切记
- 下一篇: 外包程序员入职蚂蚁金服被质疑,网友:人生