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é)過(guò)C/C++的朋友們都知道,在交換2個(gè)數(shù)的時(shí)候,如果自己實(shí)現(xiàn)一個(gè)swap函數(shù),需要傳遞其引用或者指針。
Python直接使用引用傳遞,多方便啊,你還要吐槽什么?你又想過(guò)我不想改變?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]
啊哈,貌似出問(wèn)題了哈,這個(gè)可不是我們需要的!怎么辦呢?好了,進(jìn)入今天的正題,Python中的copy模塊!
import copy
如果你希望復(fù)制一個(gè)容器對(duì)象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,這個(gè)方法會(huì)消耗一些時(shí)間和空間,不過(guò),如果你需要完全復(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)文章
python實(shí)現(xiàn)TCP文件接收發(fā)送
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)TCP文件接收發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
pycharm 更改創(chuàng)建文件默認(rèn)路徑的操作
今天小編就為大家分享一篇pycharm 更改創(chuàng)建文件默認(rèn)路徑的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
在?Python?中創(chuàng)建DataFrame的方法
這篇文章主要介紹了教你如何在?Python?中創(chuàng)建DataFrame,我們將學(xué)習(xí)以多種方式創(chuàng)建DataFrame,DataFrame是數(shù)據(jù)的二維集合,是一種數(shù)據(jù)結(jié)構(gòu),其中數(shù)據(jù)以表格形式存儲(chǔ),更多相關(guān)資料需要的小伙伴可以參考一下2022-03-03
python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法
今天小編就為大家分享一篇python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06

