python中的對(duì)象拷貝示例 python引用傳遞
何謂引用傳遞,我們來(lái)看一個(gè)C++交換兩個(gè)數(shù)的函數(shù):
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
這個(gè)例子就是一個(gè)引用傳遞的例子!目的是說(shuō)明一下概念:引用傳遞的意思就是說(shuō)你傳遞的是對(duì)象的引用,對(duì)這個(gè)引用的修改也會(huì)導(dǎo)致原有對(duì)象的改變。學(xué)過C/C++的朋友們都知道,在交換2個(gè)數(shù)的時(shí)候,如果自己實(shí)現(xiàn)一個(gè)swap函數(shù),需要傳遞其引用或者指針。
Python直接使用引用傳遞,多方便啊,你還要吐槽什么?你又想過我不想改變?cè)瓕?duì)象的情況嗎?如果有,那么看這里!
假設(shè)我現(xiàn)在有一個(gè)list,叫做l1,我現(xiàn)在需要一份l1的拷貝,如果我直接使用諸如l2 = l1的方式,然后我對(duì)l2進(jìn)行一系列的修改,會(huì)等價(jià)于我對(duì)l1直接做修改,這可不是我想要的!如:
l1 = [1, 2]
l2 = l1
l2.append(3)
print l1
print l2
# l1 = [1, 2, 3], l2 = [1, 2, 3]
這就是Python引用傳遞造成的,也就是說(shuō)l1和l2屬于同一list對(duì)象,那么如何才能得到一份不同的對(duì)象呢?這不是so easy嘛,用切片撒,比如:
l1 = [1, 2]
l2 = l1[:]
l2.append(3)
# l1 = [1, 2], l2 = [1, 2, 3]
是的,目的達(dá)到了,別介,你確定這樣一定行?讓我們看看一個(gè)更復(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]
啊哈,貌似出問題了哈,這個(gè)可不是我們需要的!怎么辦呢?好了,進(jìn)入今天的正題,Python中的copy模塊!
import copy
如果你希望復(fù)制一個(gè)容器對(duì)象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,這個(gè)方法會(huì)消耗一些時(shí)間和空間,不過,如果你需要完全復(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)說(shuō)明:
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)文章
使用pyqt5搭建yolo3目標(biāo)識(shí)別界面的方法
這篇文章主要介紹了使用pyqt5搭建yolo3目標(biāo)識(shí)別界面的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Django實(shí)現(xiàn)whoosh搜索引擎使用jieba分詞
這篇文章主要介紹了Django實(shí)現(xiàn)whoosh搜索引擎使用jieba分詞,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04如何在windows下安裝Pycham2020軟件(方法步驟詳解)
這篇文章主要介紹了在windows下安裝Pycham2020軟件方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Python實(shí)現(xiàn)基本Socket服務(wù)端與客戶端通信的完整代碼
這篇文章主要介紹了Python實(shí)現(xiàn)基本Socket服務(wù)端與客戶端通信,分步詳解與完整代碼都有,按需所求即可,對(duì)Python Socket服務(wù)端與客戶端通信相關(guān)知識(shí)感興趣的朋友一起看看吧2023-06-06Python 2種方法求某個(gè)范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù))
這篇文章主要介紹了Python 2種方法求某個(gè)范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01