python中的對象拷貝示例 python引用傳遞
何謂引用傳遞,我們來看一個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)行一系列的修改,會等價(jià)于我對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ù)制,這是唯一的方法。上面我們提到的切片的方式,等價(jià)于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.
相關(guān)文章
Django實(shí)現(xiàn)whoosh搜索引擎使用jieba分詞
這篇文章主要介紹了Django實(shí)現(xiàn)whoosh搜索引擎使用jieba分詞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04如何在windows下安裝Pycham2020軟件(方法步驟詳解)
這篇文章主要介紹了在windows下安裝Pycham2020軟件方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Python實(shí)現(xiàn)基本Socket服務(wù)端與客戶端通信的完整代碼
這篇文章主要介紹了Python實(shí)現(xiàn)基本Socket服務(wù)端與客戶端通信,分步詳解與完整代碼都有,按需所求即可,對Python Socket服務(wù)端與客戶端通信相關(guān)知識感興趣的朋友一起看看吧2023-06-06Python 2種方法求某個范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù))
這篇文章主要介紹了Python 2種方法求某個范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01