1. 程式人生 > >python學習(六):python中賦值、淺拷貝、深拷貝的區別

python學習(六):python中賦值、淺拷貝、深拷貝的區別

存在賦值、淺拷貝、深拷貝問題的資料型別是對組合物件來說,所謂的組合物件就是包含了其它物件的物件,如列表,類例項。

其他的單個物件則不存在這個問題。

可變物件: list, dict.

不可變物件有: int, string, float, tuple.

 

  • 直接賦值:其實就是物件的引用(別名)。

  • 淺拷貝(copy):拷貝父物件,不會拷貝物件的內部的子物件。

  • 深拷貝(deepcopy): copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。

字典淺拷貝例項

例項

>>>a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

深度拷貝需要引入 copy 模組:

例項

>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

解析

1、b = a: 賦值引用,a 和 b 都指向同一個物件。

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

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

更多例項

以下例項是使用 copy 模組的 copy.copy( 淺拷貝 )和(copy.deepcopy ):

例項

#!/usr/bin/python
# -*-coding:utf-8 -*-
 
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 )
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  b 

當b=a   b就是 a的一個引用,a怎麼變化,b就會怎麼變化。

當b=a.copy() 淺拷貝 只拷貝了父物件,沒有拷貝子物件  a新增新的子物件的話,b不會變  但是修改原本的子物件 b會變

當b=a.deepcopy() 深拷貝,a怎麼變,b都不會再變了。