您好,登錄后才能下訂單哦!
Python中如何拷貝對象?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
你想復(fù)制一個對象?因?yàn)樵赑ython中,無論你把對象做為參數(shù)傳遞,做為函數(shù)返回值,都是引用傳遞的。
何謂引用傳遞,我們來看一個C++交換兩個數(shù)的函數(shù):
void swap(int &a,int &b) { int temp; temp= a; a= b; b= temp; }
這個例子就是一個引用傳遞的例子!目的是說明一下概念:引用傳遞的意思就是說你傳遞的是對象的引用,對這個引用的修改也會導(dǎo)致原有對象的改變。學(xué)過C/C++的朋友們都知道,在交換2個數(shù)的時候,如果自己實(shí)現(xiàn)一個swap函數(shù),需要傳遞其引用或者指針。
Python直接使用引用傳遞,多方便啊,你還要吐槽什么?你又想過我不想改變原對象的情況嗎?如果有,那么看這里!
假設(shè)我現(xiàn)在有一個list,叫做l1,我現(xiàn)在需要一份l1的拷貝,如果我直接使用諸如l2 = l1的方式,然后我對l2進(jìn)行一系列的修改,會等價于我對l1直接做修改,這可不是我想要的!如:
l1= [1,2] l2= l1 l2.append(3) print l1 print l2 # l1 = [1, 2, 3], l2 = [1, 2, 3]
這就是Python引用傳遞造成的,也就是說l1和l2屬于同一list對象,那么如何才能得到一份不同的對象呢?這不是so easy嘛,用切片撒,比如:
l1= [1,2] l2= l1[:] l2.append(3) # l1 = [1, 2], l2 = [1, 2, 3]
是的,目的達(dá)到了,別介,你確定這樣一定行?讓我們看看一個更復(fù)雜的情況:
l1 = [[1, 2], 3] l2 = l1[:] l2.append(4) # l1 = [[1, 2], 3], l2 = [[1, 2], 3, 4] l2[0].append(5) # l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4]
啊哈,貌似出問題了哈,這個可不是我們需要的!怎么辦呢?好了,進(jìn)入今天的正題,Python中的copy模塊!
import copy
如果你希望復(fù)制一個容器對象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,這個方法會消耗一些時間和空間,不過,如果你需要完全復(fù)制,這是唯一的方法。上面我們提到的切片的方式,等價于copy模塊中的copy函數(shù)。
上面拷貝的操作變得so easy了:
l1= [[1,2],3] l2= copy.copy(l1) l3= copy.deepcopy(l1) l2.append(4) l2[0].append(5) l3[0].append(6) # l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4], l3 = [[1, 2, 6], 3]
相關(guān)說明:
copy(x) Shallow copy operation on arbitrary Python objects. See the module's __doc__ string for more info. deepcopy(x, memo=None, _nil=[]) Deep copy operation on arbitrary Python objects. See the module's __doc__ string for more info.
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。