python 深 淺拷貝

2022-07-04 05:30:15 字數 2867 閱讀 4227

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 = 1

b = 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 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....