Python | 三種賦值(直接賦值,copy,deepcopy)


目錄

1  三種拷貝方式
2  解釋
3  實例
4  參考

背景

最近室友面試的時候考官就問到了一個問題:你覺得copy和deepcopy有什么區別? 於是在大神室友的熏陶下以及借鑒了網上的資料,就有了這篇博文~

三種拷貝方式

  1. 直接賦值:其實就是對象的引用(別名)。
  2. 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。
  3. 深拷貝(deepcopy): copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。
    解釋
  • 第一種:
  • 第二種:
  • 第三種:

實例

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始對象
 
b = a                       #賦值,傳對象的引用
c = copy.copy(a)            #對象拷貝,淺拷貝
d = copy.deepcopy(a)        #對象拷貝,深拷貝
 
a.append(5)                 #修改對象a
a[4].append('c')            #修改對象a中的['a', 'b']數組對象
 
print( 'a = ', a ) # 直接賦值兩者會同步去變化 都指向同一個對象
print( 'b = ', b ) # 同上
print( 'c = ', c ) # 淺拷貝只是拷貝了結構,即拷貝父對象,不會拷貝對象的內部的子對象。所以里面的list沒有拷貝
print( 'd = ', d ) # 完全拷貝了父對象及其子對象
a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c =  [1, 2, 3, 4, ['a', 'b', 'c']]
d =  [1, 2, 3, 4, ['a', 'b']]

問題:現在是a的父對象發生增加,則不會被拷貝,但是如果a的父對象發生了變化而不是增加呢?

a[0] = 23
a

python [23, 2, 3, 4, ['a', 'b', 'c'], 5]

python c

python [1, 2, 3, 4, ['a', 'b', 'c']]

結論:

淺拷貝下,a的父對象發生變化或者增加刪除,之前拷貝的c不會變化。但是a的子對象變化,c會同步發生變化,因為並未拷貝子對象。

參考http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html


免責聲明!

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



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