Python中的復(fù)制操作及copy模塊中的淺拷貝與深拷貝方法
程序中常常需要復(fù)制一個對象, 按思路應(yīng)該是這樣的
a = [1, 2, 3] b = a # [1, 2, 3] print b
已經(jīng)復(fù)制好了,但是現(xiàn)在得改變一下第一個元素的值把它改成5
b[0] = 5 # [5, 2, 3] print b # [5, 2, 3] print a
我改變了b的第一個元素的值,但是a的值也改變了,這是因為python中的=是引用.a和b指向的是相同的列表,所以改變列表會出現(xiàn)以上的結(jié)果.
解決方法是切片操作
a = [1, 2, 3] b = a[:] b[0] = 4 # [1, 2, 3] # [4, 2, 3] print a print b
但是在嵌套列表的時候呢,試一試
a = [[1,2,3], 4, 5] b = a[:] b[1] = 0 # [[1,2,3], 4, 5] # [[1,2,3], 0, 5] print a print b
恩!沒什么問題,在試一試嵌套列表元素
a = [[1,2,3], 4, 5] b = a[:] b[0][0] = 5 # [[5,2,3], 4, 5] # [[5,2,3], 4, 5] print a print b b = a[:]
a的值還是改變了,切片復(fù)制只對該對象進行拷貝不會對子元素進行拷貝
copy 模塊
copy模塊用于對象的拷貝操作。該模塊非常簡單,只提供了兩個主要的方法: copy.copy 與 copy.deepcopy ,分別表示淺復(fù)制與深復(fù)制。什么是淺復(fù)制,什么是深復(fù)制,網(wǎng)上有一卡車一卡車的資料,這里不作詳細介紹。復(fù)制操作只對復(fù)合對象有效。用簡單的例子來分別介紹這兩個方法。
淺復(fù)制只復(fù)制對象本身,沒有復(fù)制該對象所引用的對象。
#coding=gbk import copy l1 = [1, 2, [3, 4]] l2 = copy.copy(l1) print l1 print l2 l2[2][0] = 50 print l1 print l2
結(jié)果:
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [50, 4]] [1, 2, [50, 4]]
同樣的代碼,使用深復(fù)制,結(jié)果就不一樣:
import copy l1 = [1, 2, [3, 4]] l2 = copy.deepcopy(l1) print l1 print l2 l2[2][0] = 50 print l1 print l2
結(jié)果:
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [50, 4]]
改變copy的默認行為
在定義類的時候,通過定義__copy__和__deepcopy__方法,可以改變copy的默認行為。下面是一個簡單的例子:
class CopyObj(object): def __repr__(self): return "CopyObj" def __copy__(self): return "Hello" obj = CopyObj() obj1 = copy.copy(obj) print obj print obj1
結(jié)果:
CopyObj Hello
相關(guān)文章
Python創(chuàng)建一個空的dataframe,并循環(huán)賦值的方法
今天小編就為大家分享一篇Python創(chuàng)建一個空的dataframe,并循環(huán)賦值的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11APPium+Python編寫真機移動端自動化腳本的項目實踐
本文主要介紹了APPium+Python編寫真機移動端自動化腳本的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07django為Form生成的label標(biāo)簽添加class方式
這篇文章主要介紹了django為Form生成的label標(biāo)簽添加class方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Jupyter Notebook切換虛擬環(huán)境的三種方法
本文主要介紹了Jupyter Notebook切換虛擬環(huán)境的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07