python 深復制和淺復制


https://www.python-course.eu/python3_deep_copy.php
-----------------------------------------------------------------------
summarry:
>>> colours1 = ["red", "blue"]
>>> colours2 = colours1            
>>> print(colours1)
['red', 'blue']
>>> print(colours2)
['red', 'blue']
>>> print(id(colours1),id(colours2))
43444416 43444416
# colours2是colours1的淺復制,即只復制了引用指針,所以他們的內存地址是一樣的,簡單地說colours2只是colours1的別名

>>> colours1 = ["red", "blue"]
>>> colours2 = ["rouge", "vert"]
>>> print(colours1)
['red', 'blue']
>>> print(colours2)
['rouge', 'vert']
>>> print(id(colours1),id(colours2))
43444416 43444200
# 這里的colours2已經不是colours1的淺復制了,colours2獲得了內存分配的地址,是一個與colours1無關的新變量。

>>> colours2[1] = "green"
>>> print(id(colours1),id(colours2))
14603760 14603760
>>> print(colours1)
['red', 'green']
>>> print(colours2)
['red', 'green']
# colours2改變了第二個元素值,即改變了colours1的第二個值,這是淺復制的結果

>>> colours1 = ["red", "blue"]
>>> colours2 = colours1[:]
>>> colours2[1] = "orange"
>>> colours1
["red", "blue"]
>>> colours2
["red", "orange"]
# 但如果我們使用切片復制的話就不會受到淺復制的影響,前提是復制的對象是不含子列表的。

>>> lst1 = ['a','b',['ab','ba']]
>>> lst2 = lst1[:]
>>> lst2[0] = 'c'
>>> print(lst1)
['a', 'b', ['ab', 'ba']]
>>> print(lst2)
['c', 'b', ['ab', 'ba']]
>>>
>>> lst2[2][1] = 'd'
>>> print(lst1)
['a', 'b', ['ab', 'd']]
>>> print(lst2)
['c', 'b', ['ab', 'd']]
# 如果復制的對象包含子列表的話也會受到淺復制的影響。因為lst1和lst2第3個元素指針是指向同一個list對象,即['ab', 'ba']

>>> from copy import deepcopy
>>>
>>> lst1 = ['a','b',['ab','ba']]
>>>
>>> lst2 = deepcopy(lst1)
>>>
>>> lst1
['a', 'b', ['ab', 'ba']]
>>> lst2
['a', 'b', ['ab', 'ba']]
>>> id(lst1)
139716507600200
>>> id(lst2)
139716507600904
>>>
>>> lst2[2][1] = "d"
>>> lst2[0] = "c"
>>> print(lst1)
['a', 'b', ['ab', 'ba']]
>>> print(lst2)
['c', 'b', ['ab', 'd']]
# 所以要深復制可以用from copy import deepcopy

---------------------------------------------------------------------------------------
以下本人的驗證的一個例子,感覺說的不對或不順的自己驗證一下,我不保證都對。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import copy
dict1 = {'user': 'vickey', 'num': [1, 2, 3],'age':{'a':'1','b':'2'}}
dict2 = dict1 # 對原始數據的任何操作都會影響該復制
# 先進行數據的淺復制和深復制操作
dict3 = dict1.copy() # 淺復制: 一級為引用對象,二級為拷貝;原始數據的二級目錄改變了,淺復制的數據的二級目錄也會改變,但一級目錄不變
dict4 = copy.deepcopy(dict1) # 深復制:深拷貝父對象(一級目錄),子對象(二級目錄)是引用,非拷貝;簡單地說就是與最原始的的數據時完全一致的
# 修改 data 數據
dict1['user'] = 'root'
dict1['num'].remove(3)
dict1['num'].append(6)
dict1['age']['a'] = '111'
# 對數據操作后再復制,則深復制和淺復制無差別了,都是更改后的數據
# dict3 = dict1.copy()
# dict4 = copy.deepcopy(dict1)
# 輸出結果
print(dict1)
print(dict2)
print(dict3)
print(dict4)


打印結果

{'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'root'}
{'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'root'}
{'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'vickey'}
{'age': {'a': '1', 'b': '2'}, 'num': [1, 2, 3], 'user': 'vickey'}

 


免責聲明!

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



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