python的資料結構總體分為兩類:
1、字串和數字
2、列表、元組、字典等
對於字串和數字而言,賦值(=)、淺拷貝(copy)和深拷貝(deepcopy)其實都沒有意義,因為它們都永遠指向同乙個記憶體位址。
>>> import copy如圖:>>> a1 = 100
>>> id(a1)
1426656816 # a1的記憶體位址
# 賦值
>>> a2 = a1
>>> id(a2)
1426656816
# 淺拷貝
>>> a3 = copy.copy(a1)
>>> id(a3)
1426656816
# 深拷貝
>>> a4 = copy.deepcopy(a1)
>>> id(a4)
1426656816
對於列表、字典而言,進行賦值(=)、淺拷貝(copy)和深拷貝(deepcopy),其引起的變化是不一樣的。
name2 = names
names[1] = "pear"
print(names)
print(name2)
print("-----------------")
names[3][1] = "dog"
print(names)
print(name2)
print(id(names))
print(id(name2))
# 輸出
-----------------
['angle', 'pear', 'athena', ['banana', 'dog']]
['angle', 'pear', 'athena', ['banana', 'dog']]
1504387406536
1504387406536
# 可以看到names 的每一次變化,name2也會改變,因為他們的記憶體位址是一樣的
如圖:
這和字串和數字是不一樣的,當我們定義 a =1 ,b = a ,改變a時,b是不會有變化的。列表和字典等會跟著變化,因為他們的記憶體位址是一樣的。
a = 1b = a
a = 100
print(a)
print(b)
# 輸出
1001
import copy我們接下來看:name2 = copy.copy(names)
names[1] = "宙斯"
print(names, "names的記憶體位址是{}".format(id(names)))
print(name2, "name2的記憶體位址是{}".format(id(name2)))
#輸出我們淺copy了乙個name2,同時我們將names中的zous的值改為中文,但是name2的沒有改變。因為他們的記憶體位址是不一樣的,改變其中乙個不影響另外乙個。
import copy我們通過列印的記憶體位址可以明顯看出,整個外層列表的記憶體位址是不一樣的,但是裡層的列表記憶體位址是一致的。name2 = copy.copy(names)
names[1] = "宙斯"
print(names, "names的記憶體位址是{}".format(id(names)))
print(name2, "name2的記憶體位址是{}".format(id(name2)))
names[3][1] = '蘋果'
print(names, id(names[3]))
print(name2, id(name2[3]))
# 輸出
['angle', '宙斯', 'athena', ['banana', '蘋果']] 2306153648968
['angle', 'zous', 'athena', ['banana', '蘋果']] 2306153648968
# 這次我們不僅改變了最外層的列表的值,還改變了列表中乙個列表的值。
# 這次的結果是 裡層的列表跟著做了改變
如圖:
深拷貝(copy.deepcopy(x))其實就是重新開闢了乙個新的記憶體位址,儲存deepcopy後的資料,和原來資料的記憶體位址完全不一樣了,包括裡層資料型別的記憶體位址。
import copy如圖:name2 = copy.deepcopy(names)
names[1] = "宙斯"
print(names, "names的記憶體位址是{}".format(id(names)))
print(name2, "name2的記憶體位址是{}".format(id(name2)))
names[3][1] = '蘋果'
print(names, id(names[3]))
print(name2, id(name2[3]))
#輸出['angle', '宙斯', 'athena', ['banana', '蘋果']] 2379824304968
#可以看出,names不論是改變外層還是裡層列表的資料,都不會影響到name2。
python 深淺拷貝案例 python 深淺拷貝
深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...
python 深淺拷貝
建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...
python深淺拷貝
python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....