您好,登錄后才能下訂單哦!
本文以python的數據拷貝為例,為大家分析淺拷貝與深拷貝的區別,閱讀完整文相信大家對python的淺拷貝與深拷貝有了一定的認識。
我們平常使用的變量賦值就是淺拷貝,即兩個變量共享同一個內存塊,相同的內存地址,一旦值發生改變,另外一個變量的值也會跟隨著一起變化,演示代碼如下:
1 2 3 4 5 6 7 8 9 10 | list1 = [1,2,3,4,5] # 普遍的變量賦值 list2 = list1 print(id(list1)) print(id(list2))
# 修改列表list2的數據 list2.append(123) print(list1) print(list2) |
輸出結果:
1 2 3 4 | 2251297055368 2251297055368 [1, 2, 3, 4, 5, 123] [1, 2, 3, 4, 5, 123] |
注意:常規的變量賦值共享一個內存塊,內存地址相同,一旦值發生改變,共享同一個內存地址的所有變量值都會發生改變,可以直接通過內置函數id()對比下內存地址即可!
在python開發過程中,有些時候對于上面的情況并不是我們想要的,我們更加希望對賦值后的變量做修改并不影響原始變量的值,如何實現呢?這里就需要介紹一下copy模塊:
copy.copy() – 淺拷貝,重新分配內存,只拷貝父對象,不會拷貝對象的內部的子對象;
copy.deepcopy() – 深拷貝,重新分配內存,拷貝對象及其所有子對象;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個人博客地址): shuopython.com @WeChat Official Account(微信公眾號):猿說python @Github:www.github.com
@File:python_copy.py @Time:2019/10/27:25
@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累! """
import copy spam = ['A', 'B', 'C', 'D'] # 使用淺拷貝 cheese = copy.copy(spam) cheese[1] = 42 print(id(spam),spam) print(id(cheese),cheese) |
輸出結果:
1 2 | 57205555 ['A', 'B', 'C', 'D'] 57208888 ['A', 42, 'C', 'D'] |
1 2 3 4 5 6 7 | import copy spam = ['A', 'B', 'C', 'D'] # 使用深拷貝 cheese = copy.deepcopy(spam) cheese[1] = 42 print(id(spam),spam) print(id(cheese),cheese) |
輸出結果:
1 2 | 57205555 ['A', 'B', 'C', 'D'] 57208888 ['A', 42, 'C', 'D'] |
對于常規的字典或者列表使用copy模塊的深拷貝或者淺拷貝,兩者并沒有區別!如果字典或者列表中還有包含有子類的話,使用copy模塊的深拷貝和淺拷貝的話,結果就大不相同了:
copy.copy() — 重新分配內存,只拷貝父對象,不會拷貝對象內部的子對象;
copy.deepcopy() — 重新分配內存,拷貝對象及其所有子對象;
示例代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import copy
print("使用淺拷貝:") spam = [['A','E'], 'B', 'C', 'D'] # 使用淺拷貝 cheese = copy.copy(spam) cheese[0][0] = 42 print(id(spam),spam) print(id(cheese),cheese) print("***"*20)
print("使用深拷貝:") spam = [['A','E'], 'B', 'C', 'D'] # 使用深拷貝 cheese = copy.deepcopy(spam) cheese[0][0] = 42 print(id(spam),spam) print(id(cheese),cheese) |
輸出結果:
1 2 3 4 5 6 7 | 使用淺拷貝: 2179653046408 [[42, 'E'], 'B', 'C', 'D'] 2179653046920 [[42, 'E'], 'B', 'C', 'D'] ************************************************************ 使用深拷貝: 2179653086728 [['A', 'E'], 'B', 'C', 'D'] 2179653046408 [[42, 'E'], 'B', 'C', 'D'] |
以上就是python的淺拷貝與深拷貝的區別,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。