Python中的深淺拷貝

2022-06-21 08:12:07 字數 1731 閱讀 8598

前言:我們在了解深淺拷貝之前首先需要明白的一點知識

不可變型別資料:不可變型別即指當改變其內元素時,記憶體空間將會發生變化,比如常見的不可變型別有:str,boolean, int,tuple。

temp = "哈哈哈"

ret = temp.replace("哈", "嘿", 2)

print(temp) # 哈哈哈

print(ret) # 嘿嘿哈

# 我們可以看到temp的值並沒有發生改變,這就是為什麼對str資料改變之後需要重新賦值的原因,因為它是不可變型別,只能重新找乙個值接收。

可變型別資料:當改變其內元素時,記憶體空間不會發生變化,比如常見的可變型別有:list,set,dict。

lst = [1, 2, 3]

print(lst) # [1, 2, 3, 4]

# 而對可變型別資料進行操作時,因為它是可變型別資料,沒有改變原來的記憶體位址空間,所以不需要重新賦值,可以直接列印

賦值與深淺拷貝

# 賦值

lst = [1, 2, 3, 4]

lst2 = lst

print(lst) # [1, 2, 3, 4, 5]

print(lst2) # [1, 2, 3, 4, 5]

# 因為lst是可變型別,所以在賦值時是將lst的記憶體位址賦值給了lst2.也就意味著它們指向了同乙個記憶體空間,所以當其中任意乙個對裡面的元素進行操作時,另乙個也會改動。

# 淺拷貝

import copy

lst = [1, 2, 3, ["哈哈", "嘿嘿"]]

# lst2 = lst.copy() 淺拷貝

lst2 = copy.copy(lst) # 淺拷貝,二者任選其一,都是淺拷貝

print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿"]]

print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿", "嘻嘻"]]

# 從中我們可以看到,當進行淺拷貝時,拷貝之後的物件並不是完全和原物件沒有關係,當原物件對裡面的列表進行修改時,拷貝後的物件裡面的列表也跟著修改。這就稱為淺拷貝。

# 當進行淺拷貝時會對裡面每個元素進行拷貝,然而當裡面有乙個可變型別資料時,它這時候就不是拷貝資料本身,而是拷貝的這個可變資料的記憶體位址,這也就能解釋為什麼改變原有物件還能對拷貝後的物件產生影響了,因為它們本身還是指向同乙個記憶體位址。

# 你也可以簡單理解淺拷貝:淺拷貝只拷貝第一層。

# 深拷貝

import copy

lst = [1, 2, 3, ["哈哈", "嘿嘿"]]

lst2 = copy.deepcopy(lst) # 深拷貝

print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿"]]

print(slt2) # [1, 2, 3, ["哈哈", "嘿嘿"]]

# 深拷貝即完全拷貝,不管裡面的元素是否含有可變型別資料,拷貝的就是資料本身,而不是物件記憶體位址。

插圖淺拷貝

深拷貝

tips:圖畫的很糙,可能你們看了也不懂,但我就是要畫 ~~

python中深淺拷貝

先弄懂下面概念 變數 引用 物件 可變物件,不可變物件 切片 拷貝 淺拷貝,深拷貝 變數是乙個系統表的元素,擁有指向物件的鏈結的空間 物件是被分配的一塊記憶體,儲存其所代表的值 引用是自動形成的從變數到物件的指標 在python中不可變物件知 一旦建立就不可修改物件,包括字元創,元組,數字 在pyt...

Python 中的深淺拷貝

python 中的物件之間賦值時,時按照引用傳遞,如果需要拷貝物件 需要使用標準庫中的copy模組 1.copy.copy淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件 2.copy.deepcopy深拷貝 拷貝物件及其子物件 示例 encoding utf 8 import copy a 1,2...

python中的深淺拷貝

深淺拷貝 定義 1.淺拷貝 拷貝了最外層的物件,內部的元素只拷貝了乙個引用 2.深拷貝 外層的物件和內部的元素都拷貝 賦值 了一遍 術語 1.變數 是乙個系統表的元素,擁有指向物件的連線空間 2.物件 會在記憶體中占用一塊空間 3.引用 是自動形成的從變數到物件的指標 首位址,引用 4.型別 物件型...