天天看點

linux淺拷貝和深拷貝,關于 Python 深拷貝與淺拷貝

Python的資料結構總體分為兩類:

1、字元串和數字

2、清單、元組、字典等

一、字元串和數字

對于字元串和數字而言,指派(=)、淺拷貝(copy)和深拷貝(deepcopy)其實都沒有意義,因為它們都永遠指向同一個記憶體位址。

如圖:

linux淺拷貝和深拷貝,關于 Python 深拷貝與淺拷貝

二、清單、元組、字典等

對于清單、字典而言,進行指派(=)、淺拷貝(copy)和深拷貝(deepcopy),其引起的變化是不一樣的。

2.1、指派(=)

如圖:

linux淺拷貝和深拷貝,關于 Python 深拷貝與淺拷貝

這和字元串和數字是不一樣的,當我們定義 a =1 ,b = a ,改變a時,b是不會有變化的。清單和字典等會跟着變化,因為他們的記憶體位址是一樣的。

2.2、淺拷貝(copy)

我們接下來看:

我們通過列印的記憶體位址可以明顯看出,整個外層清單的記憶體位址是不一樣的,但是裡層的清單記憶體位址是一緻的。

如圖:

linux淺拷貝和深拷貝,關于 Python 深拷貝與淺拷貝

總結:淺拷貝(copy.copy(x))隻是将清單等資料類型的第一層copy了一下,記憶體位址改變了。但是對于裡層的資料類型的記憶體位址沒有改變。

2.3、深拷貝(deepcopy)

深拷貝(copy.deepcopy(x))其實就是重新開辟了一個新的記憶體位址,存儲deepcopy後的資料,和原來資料的記憶體位址完全不一樣了,包括裡層資料類型的記憶體位址。

如圖:

linux淺拷貝和深拷貝,關于 Python 深拷貝與淺拷貝
linux淺拷貝和深拷貝,關于 Python 深拷貝與淺拷貝