溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中如何拷貝對象

發(fā)布時間:2020-09-24 14:12:57 來源:億速云 閱讀:146 作者:Leah 欄目:編程語言

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è)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI