python學習筆記--深拷貝與淺拷貝的區別

来源:https://www.cnblogs.com/tianyikun/archive/2018/12/03/10061157.html
-Advertisement-
Play Games

首先我們來講講我們python中的可變對象和不可變對象: 可變對象:該對象指向記憶體中的值是可以改變的。實際上是其所指的值直接發生改變,而不是發生複製,或者開闢一個新的地址空間。例如:列表list,字典dict,集合set。 不可變對象:該對象所指向的記憶體中的值是不能被改變的。當改變一個變數時,由於其 ...


首先我們來講講我們python中的可變對象和不可變對象:

可變對象:該對象指向記憶體中的值是可以改變的。實際上是其所指的值直接發生改變,而不是發生複製,或者開闢一個新的地址空間。例如:列表list,字典dict,集合set 
不可變對象:該對象所指向的記憶體中的值是不能被改變的。當改變一個變數時,由於其所指的值不能被改變,相當於把原來的值複製一份到新開闢的地址,再進行改變,並將變數指向這個新的地址空間。例如:數值類型(int、float)、字元串str、元組tuple

python中對象的賦值實際上是對象的引用,例如:

a = [1,2,3]

實際上在電腦內部是生成一個地址將list[1,2,3]放在這個地址,在賦值給a時,就是講a指向了這個地址。如果此時我們再執行 a = [4,5,6],並不是說在我們的記憶體中[1,2,3]就不存在了,這個列表是一直存在的,只是我們將變數a指向了一個新的列表的地址。

  • 下麵我們講講淺拷貝(包含可變對象:此處可變為中間的list對象):
 
  1. >>> alist=[1,2,3,["a","b"]]
  2. >>> b = alist
  3. >>>print b
  4. [1,2,3,['a','b']]
  5. >>> alist.append(5)
  6. >>>print alist
  7. [1,2,3,['a','b'],5]
  8. >>>print b
  9. [1,2,3,['a','b'],5]

在這個程式塊中,當我們執行alist.append(5)實際上改變的是alist這個變數指向的list,由於我們的變數b也是指向這個list,所以變數b的值也跟著改變。

  • copy.copy()淺拷貝 
    這個copy.copy沒有拷貝可變對象,即當可變對象發生變化時,所有的變數都會跟著發生變化。 
    例如:
 
  1. >>>import copy
  2. >>> c=copy.copy(alist)
  3. >>>print alist;print c
  4. [1,2,3,['a','b']]
  5. [1,2,3,['a','b']]
  6. >>> alist.append(5)
  7. >>>print alist;print c
  8. [1,2,3,['a','b'],5]
  9. [1,2,3,['a','b']]
  10. >>> alist[3]
  11. ['a','b']#這個對象是可變對象
  12. >>> alist[3].append('cccc')
  13. >>>print alist;print c
  14. [1,2,3,['a','b','cccc'],5]
  15. [1,2,3,['a','b','cccc']]
  • copy.deepcopy拷貝了包含可變對象在內的所有對象
 
  1. >>>import copy
  2. >>> d=copy.deepcopy(alist)#此時dalist是兩個完全獨立的對象
  3. >>>print alist;print d
  4. [1,2,3,['a','b']]
  5. [1,2,3,['a','b']]始終沒有改變
  6. >>> alist.append(5)
  7. >>>print alist;print d
  8. [1,2,3,['a','b'],5]
  9. [1,2,3,['a','b']]始終沒有改變
  10. >>> alist[3]
  11. ['a','b']
  12. >>> alist[3].append("ccccc")
  13. >>>print alist;print d
  14. [1,2,3,['a','b','ccccc'],5]
  15. [1,2,3,['a','b']]始終沒有改變

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 拷貝控制 右值與const引用 背景:當一個函數的返回值是自定義類型時,調用側用什麼類型接收?? 1,如果自定義類型的拷貝構造函數的參數用const修飾了:可以用下麵的方式接收。 2,如果自定義類型的拷貝構造函數的參數沒有用const修飾了:必須用下麵的方式接收 編譯錯誤: 解釋: 第一種條件下,用 ...
  • 值傳遞: (形式參數類型是基本數據類型和String):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。 引用傳遞: (形式參數類型是引用數據類型參數除去String):也稱 ...
  • 學習Java一年多了,練習了很多,這條路真的很難走.還有半年多畢業的我整理整理所學習的筆記給大家分享主要也是讓自己記憶加深.自學時用到的時阿發老師的教學視頻,通俗易懂還有題庫可以練習.最經典的就是阿發老師會教你如何開發車而不是使用車.筆記中的截圖和源碼都是老師的.這次整理主要是給自己看的,有需要的朋 ...
  • 《工作細胞》最近比較火,bilibili 上目前的短評已經有17000多條。 先看分析下頁面 右邊 li 標簽中的就是短評信息,一共20條。一般我們載入大量數據的時候,都會做分頁,但是這個頁面沒有,只有一個滾動條。 隨著滾動條往下拉,信息自動載入了,如下圖,變40條了。由此可見,短評是通過非同步載入的 ...
  • 因為工作中慢慢開始用python的協程,所以想更好的理解一下實現方式,故翻譯此文 原文中把辭彙表放到最後,但是我個人覺得放在最開始比較好,這樣可以增加當你看原文時的理解程度 辭彙表 原生協程函數 Native coroutine function: 由async def定義的協程函數,可以使用awa ...
  • 只使用Spring的時候,我把applicationContext.xml是放在項目的src路徑下的,這樣使用ClassPathXmlApplicationContext很方便嘛 整合了struts之後,就讀取不到這個配置文件了,因為Spring會到WEB-INF下來找配置文件, Spring配置文 ...
  • 1.線程列隊 queue隊列 :使用import queue,用法與進程Queue一樣 class queue.Queue(maxsize=0) 1 # 先進先出: 2 q = queue.Queue(3) # 也可以不加數字表示不限 3 q.put('約嗎') 4 q.put('你個糟老頭') 5 ...
  • 題意 "題目鏈接" 求滿足$i^2 + j^2 \% M = 0$的數對$(i, j)$的個數,$1 \leqslant i, j \leqslant 10^9, M \leqslant 1000$ Sol 發這篇博客的目的就是為了證明一下我到底有多菜。 mdzz小學組水題我想了40min都沒想出來 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...