Python中淺拷貝與深拷貝的騷操作
【例子】淺拷貝與深拷貝中
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]]
小朋友,你是否有很多問(wèn)號(hào)?????
為什么同樣是list3 = list1[:]
執(zhí)行list1.sort() 操作,list3不發(fā)生變化
執(zhí)行list1[0][0] ?= 111 操作,list3發(fā)生變化
首先我們先了解到python的拷貝有淺拷貝和深拷貝之分
| 序號(hào) | 操作語(yǔ)句 | 拷貝類型 |
|---|---|---|
| 1 | Y= X | 直接賦值(淺拷貝) |
| 2 | Z = X [:] | 淺拷貝 |
| 3 | P = copy.copPy(X) | 淺拷貝 |
| 4 | K = copy.deepcopy(X) | 深拷貝 |
接下來(lái)我們來(lái)探索一下,這些個(gè)淺拷貝和深拷貝具體細(xì)節(jié)上有什么區(qū)別呢?
看看這個(gè)case
import?copy
X?=?[1,3,5,['我','是','第','二','維','度'],9,11]
Y=?X?#?直接賦值(淺拷貝)
Z?=?X?[:]?#?淺拷貝?
P?=?copy.copy(X)??#?淺拷貝?
K?=?copy.deepcopy(X)#?深拷貝?
#現(xiàn)在我們?cè)赬數(shù)組的第三個(gè)值里面添加一個(gè)'哈哈',把里面的是改為不是
X[3].append('哈哈')
X[3][1]?=?'不是'
#我們打印一下結(jié)果瞧一瞧
print("起始列表X為?:?",?X)
print("把X列表賦值給Y為?:?",?Y)
print("淺拷貝X列表給Z為?:?",?Z)
print("淺拷貝X列表給P為?:?",?P)
print("深拷貝X列表給K為?:?",?K)
輸出結(jié)果為:
起始列表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]
是不是發(fā)現(xiàn)深拷貝與淺拷貝的一點(diǎn)點(diǎn)區(qū)別啦 ^ . ^只有深拷貝不被更改**!!!**
辣么,我現(xiàn)在想要把X列表的第三值 ['我','是','第','二','維','度'] 改為 7,把最后一個(gè)值改為101,看看這些個(gè)淺拷貝和深拷貝又是怎么表現(xiàn)的......
import?copy
X?=?[1,3,5,['我','是','第','二','維','度'],9,11]
Y=?X??#?直接賦值(淺拷貝)
Z?=?X?[:]?#?淺拷貝?
P?=?copy.copy(X)?#?淺拷貝?
K?=?copy.deepcopy(X)#?深拷貝?
現(xiàn)在我們修改X數(shù)組的第三個(gè)值,把最后一個(gè)值改為101
X[3]?=?7
X[-1]?=?101
我們打印一下結(jié)果瞧一瞧
print("起始列表X為?:?",?X)
print("把X列表賦值給Y為?:?",?Y)
print("淺拷貝X列表給Z為?:?",?Z)
print("淺拷貝X列表給P為?:?",?P)
print("深拷貝X列表給K為?:?",?K)
輸出結(jié)果為:
起始列表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]??
咦!?發(fā)現(xiàn)了什么 ?~. ~有的淺拷貝背叛了同胞 ! 和深拷貝的表現(xiàn)是一樣的
結(jié)合上面的例子,我們發(fā)現(xiàn),對(duì)二維列表中的第一維數(shù)據(jù)做修改時(shí),使用 = 進(jìn)行賦值,對(duì)X的修改會(huì)影響Y,使用 ?[:] , copy.copy() ?, copy.deepcopy() 進(jìn)行賦值,對(duì)X的修改不會(huì)影響新的賦值。
如果是對(duì)二維列表中的第一維數(shù)據(jù)做增加或者刪除操作呢?試一試咯
import?copy
X?=?[1,3,5,['我','是','第','二','維','度'],9,11]
Y=?X??#?直接賦值(淺拷貝)
Z?=?X?[:]#?淺拷貝?
P?=?copy.copy(X)?#?淺拷貝?
K?=?copy.deepcopy(X)#?深拷貝?
#在X數(shù)組最后添加13,刪除第0個(gè)值
X.append(13)
X.remove(1)
#我們打印一下結(jié)果瞧一瞧
print("起始列表X為?:?",?X)
print("把X列表賦值給Y為?:?",?Y)
print("淺拷貝X列表給Z為?:?",?Z)
print("淺拷貝X列表給P為?:?",?P)
print("深拷貝X列表給K為?:?",?K)
輸出結(jié)果為:
起始列表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]
我們發(fā)現(xiàn),對(duì)二維列表中的第一維數(shù)據(jù)做增加或者刪除操作
同樣是只有使用 = 進(jìn)行賦值,對(duì)X的修改會(huì)影響Y
于是乎,我們可以把上面的 修改 擴(kuò)充為 增刪改 (改也就包括了排序sort()操作喲)
即對(duì)二維列表中的第一維數(shù)據(jù)做 增刪改 操作時(shí),blabla......
你以為這就結(jié)束了嗎?
我,第二維數(shù)據(jù)不想被修改,也不想用深拷貝,怎么辦?
別急,append和 [:] 組合服用就能夠達(dá)到深拷貝deepcopy的效果啦 ===>看
X?=?[['我','幾','維','度'],['我','是','第','二','維','度'],['我','不','說(shuō)']]
Y=?X??#?直接賦值(淺拷貝)
Z?=?X?[:]?#?淺拷貝?
P?=?copy.copy(X)??#?淺拷貝?
K?=?copy.deepcopy(X)??#?深拷貝?
TT?=?[]
for?i?in?X:
????TT.append(i[:])?#?我是騷操作
#修改第二維度信息
X[1].append('哈哈')
X[1][1]?=?'不是'
#我們打印一下結(jié)果瞧一瞧
print("起始列表X為?:?",?X)
print("把X列表賦值給Y為?:?",?Y)
print("淺拷貝X列表給Z為?:?",?Z)
print("淺拷貝X列表給P為?:?",?P)
print("深拷貝X列表給K為?:?",?K)
print("騷操作X列表給TT為?:?",?TT)
輸出結(jié)果為:
起始列表X為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說(shuō)']]
把X列表賦值給Y為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說(shuō)']]
淺拷貝X列表給Z為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說(shuō)']]
淺拷貝X列表給P為?:??[['我',?'幾',?'維',?'度'],?['我',?'不是',?'第',?'二',?'維',?'度',?'哈哈'],?['我',?'不',?'說(shuō)']]
深拷貝X列表給K為?:??**[['我',?'幾',?'維',?'度'],?['我',?'是',?'第',?'二',?'維',?'度'],?['我',?'不',?'說(shuō)']]
騷操作X列表給TT為?:??**[['我',?'幾',?'維',?'度'],?['我',?'是',?'第',?'二',?'維',?'度'],?['我',?'不',?'說(shuō)']]
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
剛剛用華為鴻蒙跑了個(gè)“hello world”!跑通后,我特么開(kāi)始懷疑人生....
轉(zhuǎn)了嗎 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?贊了嗎 在看嗎




