Python3中copy模組常用功能及其他幾種copy方式比較

weixin_34146805發表於2017-07-13

1、簡單的共享引用:

python中內建有小整數常量池和字串常量池,在某個範圍內的相同的數字或字串分別賦給不同的變數,這些不同的變數都是指向同一塊記憶體地址,這就是所謂的共享引用,舉幾個簡單的例子:

6857741-d24ce658a824d04b.png
字串的共享引用
6857741-8cb07eb47f002a3f.png
數字的共享引用

單純的變數的傳遞其實也是一種共享引用:

6857741-a16d563cdfc14070.png
a,b指向同一個記憶體地址,任何一方將地址指向的內容做出改變,另外一方會受到影響

2、字典的copy()方法

字典的copy()方法相當於一種深複製,即將原本的字典dic1複製出一個內容一模一樣的字典給另一個字典變數dic2,dic1和dic2的內容完全相同,但記憶體地址不同,不是共享引用,其中任何一方做出改變,另外一方不受影響,舉個例子:

6857741-7610a76fe676b62c.png

3、copy模組的兩種copy方法:copy.copy()和copy.deepcopy()

首先匯入copy模組,import copy

copy.copy()方法:複製模式跟copy()中引數的型別有關,只能copy最外層(有巢狀時),引數的型別包括可變型別和不可變型別

1、可變型別:當引數是可變型別時,該方法最外層執行的是深度複製,即複製前後的兩個變數地址不同,如果原變數中巢狀有可變型別的元素,那麼,內層進行的是淺複製,一方改變,另一方會受影響。(即兩個變數地址不同,但指向同一塊記憶體區域)

6857741-844aa03d446dd8e4.png

2、不可變型別:當copy()中的引數是不可變型別時,最外層執行淺複製(即兩個變數地址相同且指向同一塊記憶體區域),內層也執行淺複製

6857741-4c2e6ee31771f7eb.png

copy.deepcopy():不管引數是否為可變型別,遞迴地執行深度複製,如果變數中巢狀可變或不可變的變數,在複製時不管內層還是外層均執行深度複製(有一種情況除外),即另外開闢一塊記憶體空間,把原變數所有的內容都複製一份過來,賦給新的變數,兩變數雖然內容相同,但地址不同,且分別指向不同的區域,任意一方內容做出改變,另一方不會受到影響。

6857741-8a0c5f6935a2d460.png
引數為可變型別
6857741-96af465ce5d05228.png
引數為不可變型別

注意:

在使用copy.deepcopy()方法時,如果引數為不可變型別,且裡面巢狀的物件也是不可變型別,則此方法複製的結果為淺複製(即地址相同)。

6857741-92acb163fb956057.png

相關文章