要說清楚Python中的深淺拷貝,需要搞清楚下面一系列概念:
變量-引用-對象(可變對象,不可變對象)-切片-拷貝(淺拷貝,深拷貝)
【變量-對象-引用】
在Python中一切都是對象,比如說:3, 3.14, 'Hello', [1,2,3,4],{'a':1}......

甚至連type其本身都是對象,type對象
Python中變量與C/C++/Java中不同,它是指對象的引用,Python是動態類型,程序運行時候,會根據對象的類型
來確認變量到底是什么類型。
單獨賦值: 比如說:

因為Python的變量不過是對象的引用,或指向對象的指針,因此在程序中可以經常改變變量引用
變量是一個系統表的元素,擁有指向對象的連接的空間
對象是被分配的一塊內存,存儲其所代表的值
引用是自動形成的從變量到對象的指針
特別注意: 類型屬于對象,不是變量
比如像剛才的a=3, 整數對象3包含了兩重信息
1.值為3
2.一個頭部信息:告訴Pthyon,這是個整數對象[相當于一個指向int的指針]
共享引用: 比如說:


從上圖可以看到,a和b,其id完全一樣,指向同一個整數對象3,或者說同一塊內存

如果刪掉a后, 不會影響b

拷貝概念的引入就是針對:可變對象的共享引用潛在的副作用而提出的.
【可變對象-不可變對象】
在Python中不可變對象指:一旦創建就不可修改的對象,包括字符串,元祖,數字
在Python中可變對象是指:可以修改的對象,包括:列表、字典
上面說的a,b都是整數,整數是不可變對象,如果是可變對象的話,就是另外一回事了。
【拷貝】
1. 切片技術應用于所有的序列,包括:列表、字符串、元祖
>>>但切片不能應用于字典。對字典只能使用D.copy()方法或D.deepcopy()方法.

2. 深淺拷貝,即可用于序列,也可用于字典

如果字典中嵌套對象:

【結論】
深淺拷貝都是對源對象的復制,占用不同的內存空間
如果源對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
如果源對象不止一級目錄的話,源做任何改動,都要影響淺拷貝,但不影響深拷貝
序列對象的切片其實是淺拷貝,即只拷貝頂級的對象
新聞熱點
疑難解答
圖片精選