字典的深拷貝與淺拷貝


以前只知道用dict2 = dict1 來進行復制(備份),結果發現對dict2做增刪改等操作時,dict1也會隨之變化,反過來也這樣。沒有好好學習基礎的我,自然在這里面吃了不少的虧。。。

下面我們來介紹一下python的深拷貝與淺拷貝:

 1 #!/usr/bin/python
 2 # -*- coding: UTF-8 -*-
 3  
 4 dict1 =  {'user':'runoob','num':[1,2,3]}
 5  
 6 dict2 = dict1          # 淺拷貝: 引用對象
 7 dict3 = dict1.copy()   # 淺拷貝:深拷貝父對象(一級目錄),子對象(二級目錄)不拷貝,還是引用
 8  
 9 # 修改 data 數據
10 dict1['user']='root'
11 dict1['num'].remove(1)
12  
13 print(dict1)
14 print(dict2)
15 print(dict3)

實例中 dict2 其實是 dict1 的引用(別名),所以輸出結果都是一致的,dict3 父對象進行了深拷貝,不會隨dict1 修改而修改,子對象是淺拷貝所以隨 dict1 的修改而修改。

輸出結果:

{'user': 'root', 'num': [2, 3]}
{'user': 'root', 'num': [2, 3]}
{'user': 'runoob', 'num': [2, 3]}

同理 dataframe等python元素也是這樣的。

 

下面我們來對Python 的直接賦值、淺拷貝和深度拷貝進行進一步的解析

  • 直接賦值:其實就是對象的引用(別名)。

  • 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。在源對象上操作新對象可能會受影響。

  • 深拷貝(deepcopy): copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。在源對象上操作新對象不受影響。

字典淺拷貝實例

1 >>>a = {1: [1,2,3]}
2 >>> b = a.copy()
3 >>> a, b
4 ({1: [1, 2, 3]}, {1: [1, 2, 3]})
5 >>> a[1].append(4)
6 >>> a, b
7 ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

而深度拷貝需要引入 copy 模塊:

1 >>>import copy
2 >>> c = copy.deepcopy(a)
3 >>> a, c
4 ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
5 >>> a[1].append(5)
6 >>> a, c
7 ({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

 

來源:http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM