Python引用 淺拷貝 深拷貝

2021-10-19 13:27:56 字數 1154 閱讀 5653

1、概念

深拷貝:將父和子的值都進行傳遞,無論怎麼去修改源變數,深拷貝的變數都和源變數無關

2、引用

我們建立乙個變數a,通過引用將a賦值給變數b,使用id()檢視變數位址,a與b得位址一致,可見兩者此時指向同意記憶體位址,當我們改變a得值時,b得值也會變化。

# 引用示例

a = [1]

b = a

print(id(a))

print(id(b))

# 列印位址

2273708932720

2273708932720

# 修改a值

但是需要注意得是我們如下案例,我們會誤以為當我們重新再次對a賦值時,b的值應該也會變化,但是其實不是,原因就是當我們重新對a賦值其實是重新建立了乙個新的變數,python會重新分配乙個記憶體位址儲存,導致重新賦值後的a與b不一致。

a = [1]

b = a

print(id(a))

print(id(b))

a = "22"

print(id(a))

print(id(b)) 

# 結果

2242540470208

2242540470208

2242540387888 # a的位址已經發生改變,所以此時即使改變a的數值,b也無法跟著改變

2242540470208

3、淺拷貝

使用copy模組實現淺拷貝,建立列表a使用copy將a淺拷貝給b,列印兩者的位址,發現並不一致,對列表a進行新增數值,列印a和b的數值,b的數值也並未發生改變。

# 結果

2946872703552

2946872696512

[1, 2]

[1]

但是當我們建立乙個含有巢狀字典的物件,我們修改巢狀子集合時,淺拷貝的值也會發生改變,也就是說淺拷貝他管的住父級,但是管不了兒子。

# 結果

2036525447744

2036525447808

4、深拷貝

使用深拷貝則時候,我們對源變數子集進行修改,深拷貝的變數依舊不會改變。

# 結果

1967387327040

1967388801792

python 引用,淺拷貝,深拷貝

引用 當物件是不可變型別的時候,int float double string tuple 純tuple 遇到 引用 問題時,雖然起初兩個變數指向同乙個記憶體位址,但是改變了其中乙個值,並不會影響另外乙個 會重新開闢記憶體位址 當物件是可變型別的時候,list dic,遇到 引用 問題,會一直共享一...

Python深拷貝 淺拷貝 引用

列表巢狀 如果想拷貝之後賦值的變數不想影響之前的列 表變數import copy 反之copy usr bin env python coding utf 8 author mxl time 2020 3 17 import copy a 1,2,3 b a a print a的初始值為 str a...

Python 引用 淺拷貝 深拷貝解析

1 的作用。僅僅是位址的引用,當原列表或者新列表中任意元素改變,均會對另外乙個產生影響 引用 本例中屬於位址的引用,其中a和b共用同一塊記憶體 當修改共用記憶體中的任意的內容是時,均會影響到另外的內容 a 0,1,2,3,4 b a 修改a 0 後,a 0 和b 0 都會改變 a 0 10 prin...