天天看點

Python 直接指派、淺拷貝和深度拷貝的差別

  1. 直接指派:其實就是對象的引用(别名)。
  2. 淺拷貝(copy):拷貝父對象,不會拷貝對象内部的子對象。或者說是,隻拷貝對象自身,内部元素引用的其他對象隻拷貝一個引用。
  3. 深拷貝(deepcopy): copy 子產品的 deepcopy 方法,完全拷貝了父對象及其子對象。是以拷貝産生的副本可以随意修改,而不用擔心會影響原始值。

1、b = a: 指派引用,a 和 b 都指向同一個對象。

Python 直接指派、淺拷貝和深度拷貝的差別

2、b = a.copy(): 淺拷貝, a 和 b 是一個獨立的對象,但他們的子對象還是指向統一對象(是引用)。

Python 直接指派、淺拷貝和深度拷貝的差別

b = copy.deepcopy(a): 深度拷貝, a 和 b 完全拷貝了父對象及其子對象,兩者是完全獨立的。

Python 直接指派、淺拷貝和深度拷貝的差別

執行個體

以下執行個體是使用 copy 子產品的 copy.copy( 淺拷貝 )和copy.deepcopy (深拷貝)

#!/usr/bin/python3
'''
Created on 2019年5月6日
@author: Administrator
'''
import copy

def cli():
    print("start...")
    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)
    print('d = ', d)


if __name__ == '__main__':
    cli()
           
執行結果:
           
start...
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']]