Python:深拷貝與淺拷貝

1.賦值,只是創建了一個變量,這個變量還是指向原來的地址

>>> d={'k1':'v1','k2':'v2','k3':'v3','k4':[1,2,3,4]}
>>> d
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1', 'k4': [1, 2, 3, 4]}
>>> d1=d
>>> id(d),id(d1)
(51603384L, 51603384L)  #指向的變量的內存地址都一樣
>>>

2.淺拷貝。簡單來說只是拷貝最外面一層變量。

實例:

>>> import copy
>>> d2=copy.copy(d)
>>> id(d),id(d2)
(51603384L, 51661544L)
>>>

輸出結果發現d和d2所指向的地址不一樣,那我們改變其中的元素

>>> d['k1']='vv1'
>>> d
{'k3': 'v3', 'k2': 'v2', 'k1': 'vv1', 'k4': [1, 2, 3, 4]}
>>> d2
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1', 'k4': [1, 2, 3, 4]}
>>>

這裏寫圖片描述
發現改變其中一個元素的值對另一個的確沒有什麼影響。在試一試

>>> d['k4'][0]=100
>>> d
{'k3': 'v3', 'k2': 'v2', 'k1': 'vv1', 'k4': [100, 2, 3, 4]}
>>> d2
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1', 'k4': [100, 2, 3, 4]}
>>>

列表中的值都發生了改變。說明淺拷貝只能拷貝到第一層,無法拷貝第二層,列表就是第二層

3.深拷貝,在內存中將所有的數據重新創建一份(最後一層不拷貝,即:python內部對字符串和數字的優化)

>>> d3=copy.deepcopy(d)
>>> d3
{'k3': 'v3', 'k2': 'v2', 'k1': 'vv1', 'k4': [100, 2, 3, 4]}
>>> d
{'k3': 'v3', 'k2': 'v2', 'k1': 'vv1', 'k4': [100, 2, 3, 4]}
>>> d['k4'][0]=1000
>>> d
{'k3': 'v3', 'k2': 'v2', 'k1': 'vv1', 'k4': [1000, 2, 3, 4]}
>>> d3
{'k3': 'v3', 'k2': 'v2', 'k1': 'vv1', 'k4': [100, 2, 3, 4]}

深拷貝之後這兩個變量互不影響了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章