對於 數字 和 字串 而言,賦值、淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址。
import
copy
# ######### 數字、字串 #########
n1
=
123
# n1 = "age 10"
print
(
id
(n1))
# ## 賦值 ##
n2
=
n1
print
(
id
(n2))
# ## 淺拷貝 ##
n2
=
copy.copy(n1)
print
(
id
(n2))
# ## 深拷貝 ##
n3
=
copy.deepcopy(n1)
print
(
id
(n3))
對於字典、元組、列表而言,進行賦值、淺拷貝和深拷貝時,其記憶體位址的變化是不同的。
賦值
淺拷貝,在記憶體中只額外建立第一層資料
>>> n1 =
>>> n3 = copy.copy(n1)
>>> print id(n1)
11267952
>>> print id(n3)
11151792
>>> print id(n1['k3']) ##檢視記憶體位址相同
139853825328696
>>> print id(n3['k3']) ##檢視記憶體位址相同
深拷貝,在記憶體中將所有的資料重新建立乙份(排除最後一層,即:python內部對字串和數字的優化)
>>> import copy
>>> n1 =
>>> n4 = copy.deepcopy(n1)
>>> print id(n1)
11193264
>>> print id(n4)
11249664
>>> print id(n1['k3']) ##檢視記憶體位址不同
139853635849824
>>> print id(n2['k3']) ##檢視記憶體位址不同
深淺拷貝應用場景
監控場景:更改拷貝後的資料,而原來的資料保持不變!
指令碼如下:
#!/usr/bin/env python
#coding: utf8
import copy
#目的是更改資料後,原來的資料不變,而拷貝後的資料會隨時更新!
dic =
print("before:",dic)
#new_dic = copy.copy(dic) ##淺拷貝後的資料更新會把原來和新的字典內容的資料都更新!
new_dic = copy.deepcopy(dic) ##深拷貝只更新拷貝後的資料,而原來的資料保留不變!
new_dic["cpu"][0] = 50
print(dic)
print(new_dic)
輸出內容:
before:
python
深淺拷貝
python之深淺拷貝
lis 1 3,world 1,hello lis 2 lis 1.copy print 列表1元素的id lis 1,id lis 1 0 id lis 1 0 0 id lis 1 0 1 id lis 1 1 id lis 1 2 print 列表2元素的id lis 2,id lis 2 0...
python之深淺拷貝
基礎沒打牢,python的深淺copy老是混淆,模稜兩可的。一 物件賦值 a 1,2,3 b a 物件賦值 print id a print id b 執行上面的 可以發現id a id b 為什麼呢?其實是在記憶體中有乙個列表 1,2,3 a和b就是兩個標籤,都指向列表 1,2,3 如下圖 當修改...
python之深淺拷貝
在python中的資料型別包括 bool,int,float,str,set,list,tuple,dict等。簡單資料型別 bool,int,float,str 複雜資料型別 list,tuple,set,dict 對於簡單的資料型別變數在記憶體中儲存都是儲存 資料本身 而對於複雜的資料型別來說,...