Python中的賦值引用 淺拷貝 深拷貝小結

2021-09-05 10:14:25 字數 2139 閱讀 7737

有部分參考資料:

from copy import copy,deepcopy

l = [1,2,3,4,[1,2,3]]

new_l = l

copy_l = copy(l)

deepcopy_l = deepcopy(l)

print('l',id(l))

print('new_l',id(new_l))

print('copy_l',id(copy_l))

print('deepcopy_l',id(deepcopy_l))

l 12727752

new_l 12727752

copy_l 12401416

deepcopy_l 12727432 

從上面的結果可以看出 l 與被賦值物件 new_l的記憶體位址時一樣的,淺拷貝和深拷貝 後的物件的記憶體位址與原始資料的記憶體位址都不一樣,在記憶體中開闢了一塊新的記憶體空間。

現在分別來看物件中的不可變元素的id值和可變元素的id值

print('l[1]',id(l[1]),'l[-1]',id(l[-1]))

print('new_l[1]',id(new_l[1]),'new_l[-1]',id(new_l[-1]))

print('copy_l[1]',id(copy_l[1]),'copy_l[-1]',id(copy_l[-1]))

print('deepcopy_l[1]',id(deepcopy_l[1]),'deepcopy_l[-1]',id(deepcopy_l[-1]))

結果:l[1] 1488257552 l[-1] 12729672

new_l[1] 1488257552 new_l[-1] 12729672

copy_l[1] 1488257552 copy_l[-1] 12729672

deepcopy_l[1] 1488257552 deepcopy_l[-1] 12729480

從上面的執行結果可以看出:

3.深拷貝:在記憶體中的另一塊位址中建立乙個新的變數,深拷貝建立的新變數中 不可變元素與原始物件中的不可變元素的位址相同,但是可變元素與原始物件中的可變元素的位址時不同的,也就是進行了深層次的拷貝。

print(copy_l)

print(l)

# 結果

[1, 2, 3, 4, [1, 2, 3]]

[1, 2, 3, 4, [1, 2, 3], 9]

如果改變原始資料中的不可變元素,淺拷貝建立的變數copy_l,值不會改變,如果改變原始資料中的可變元素,淺拷貝建立的變數,值是會相應的改變。

print(copy_l)

print(l)

# 結果

[1, 2, 3, 4, [1, 2, 3, 9]]

[1, 2, 3, 4, [1, 2, 3, 9]]

淺拷貝建立的物件,改變該物件中的不可變元素,對原始資料不會產生影響,改變該物件中的可變元素,原始資料也會改變。

print(l)

print(copy_l)

# 結果

[1, 2, 3, 4, [1, 2, 3, 9]]

[1, 2, 3, 4, [1, 2, 3, 9]]

print(l)

print(copy_l)

# 結果

[1, 2, 3, 4, [1, 2, 3]]

[1, 2, 3, 4, [1, 2, 3], 9]

小結淺拷貝:淺拷貝建立的物件 中的元素位址與原始物件中的元素位址是相同的,那麼兩者是相互影響的,只要其中任意乙個物件中的可變元素改變,另乙個物件也會改變。

new_l = l

copy_l = copy(l)

deepcopy_l = deepcopy(l)

print(l)

print(deepcopy_l)

# 結果

[1, 2, 3, 4, [1, 2, 3, 10]]

[1, 2, 3, 4, [1, 2, 3]]

小結深拷貝:在記憶體中開闢另外一塊空間,深拷貝建立的物件位址與原始物件位址不同,但是該物件中的不可變元素與原始物件中的不可變元素位址相同,而可變位址不同,也就是說,無論是原始物件改變還是該物件改變,都不會影響對方的值。是完全的副本。

python中賦值引用 淺拷貝 深拷貝

t 1,2,2 defmain n n 0 3 return n main t print t 輸出是t 3,2,2 同樣,使用return的返回值也是一樣的結果,因為無論怎麼說,在python中的賦值都是引用,變數本身就是乙個標籤,只是我們可以通過變數取訪問記憶體中的資料而已。在實際的使用過程中如...

python中的賦值 淺拷貝 深拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 import copy a 1,2,x y b ac copy.copy a d copy.deepcopy a print id b id a i...

Python中賦值 淺拷貝與深拷貝

原文 python中關於物件複製有三種型別的使用方式,賦值 淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。一 賦值 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 list a 1,2,3,hello python c list b list a 這種...