Python的對(duì)象拷貝

對(duì)象拷貝

在面向?qū)ο缶幊讨猩氚瑁瑥?fù)制一個(gè)現(xiàn)有對(duì)象的副本搁凸,被稱(chēng)為對(duì)象拷貝媚值。生成的對(duì)象被稱(chēng)之為對(duì)象副本。
拷貝是基本的操作护糖,但是在實(shí)際操作過(guò)程中會(huì)有一些需要注意的地方褥芒。有多種方法來(lái)拷貝對(duì)象,最常見(jiàn)的是通過(guò)拷貝構(gòu)造函數(shù)或者克隆函數(shù)嫡良∶谭觯拷貝的主要目的是對(duì)副本做出修改、移動(dòng)寝受,或者是保留當(dāng)前值坷牛。
如果不需要實(shí)現(xiàn)以上目的,則創(chuàng)建對(duì)原始數(shù)據(jù)的引用是更加高效的選擇很澄。

Python的對(duì)象拷貝

在Python中京闰,賦值語(yǔ)句總是建立對(duì)象的引用,看下面的一段代碼

>>> a = [1,2,3]
>>> b = a
>>> print(id(a), id(b))
(4420030688, 4420030688)

會(huì)發(fā)現(xiàn)b = a操作后痴怨,ab指向了同一塊地址忙干。

上面例子中,ab都是可變對(duì)象(list)的浪藻,對(duì)b的修改捐迫,同樣可會(huì)影響到a,如下

>>> b.append(3)
>>> a
[1, 2, 3, 3]

那么對(duì)于可變的數(shù)據(jù)的副本爱葵,或者包含了可變對(duì)象的數(shù)據(jù)的副本施戴,如何在不改變?cè)瓟?shù)據(jù)的情況下操作副本呢?這里就要用到內(nèi)置的copy模塊了萌丈。

淺拷貝

淺拷貝

在淺拷貝中赞哗,會(huì)將原對(duì)象中所有字段復(fù)制給對(duì)象副本。如果某個(gè)字段是某個(gè)對(duì)象的引用(比如辆雾,一串內(nèi)存地址)肪笋,那么被拷貝的是這個(gè)引用,指向元數(shù)據(jù)中該字段指向的對(duì)象度迂;如果字段是基本類(lèi)型藤乙,則復(fù)制這個(gè)字段的值。

在Python這樣萬(wàn)物皆是對(duì)象的語(yǔ)言中惭墓,使用淺拷貝后坛梁,對(duì)象副本中字段和原始數(shù)據(jù)中字段都會(huì)指向同一個(gè)對(duì)象,這樣的情況下腊凶,引用的對(duì)象被共享划咐,因此拴念,如果這些對(duì)象中的一個(gè)被修改,則改變?cè)诹硗庖粋€(gè)中可見(jiàn)褐缠。淺拷貝很簡(jiǎn)單政鼠,可以通過(guò)簡(jiǎn)單的完全復(fù)制位來(lái)實(shí)現(xiàn),所以開(kāi)銷(xiāo)也很小送丰。

比如下面的例子缔俄。

>>> a = [[1,2,3], [1,2], [1]]
>>> id(a), id(a[0]), id(a[1]), id(a[2])
(4420406880, 4420406448, 4420406808, 4420406304)
>>> b = copy.copy(a)
>>> id(b), id(b[0]), id(b[1]), id(b[2])
(4420423760, 4420406448, 4420406808, 4420406304)

深拷貝

深拷貝

另一種方法是深拷貝,這意味著原對(duì)象中的字段被解引用器躏。和淺拷貝不同俐载,引用不再被拷貝,而是會(huì)為引用的值創(chuàng)建新的對(duì)象登失。也就是說(shuō)對(duì)于副本的改變不會(huì)影響到原始數(shù)據(jù)遏佣。copy模塊中的deepcopy函數(shù)可以實(shí)現(xiàn)這一點(diǎn)。

>>> import copy
>>> l1 = [2, 3, 4, [3, 5]]
>>> l2 = copy.deepcopy(l1)
>>> l1, l2
([2, 3, 4, [3, 5]], [2, 3, 4, [3, 5]])
>>> l2[3].append(6)
>>> l2.append(7)
>>> l1, l2
([2, 3, 4, [3, 5]], [2, 3, 4, [3, 5, 6], 7])

總結(jié)

Python中copy模塊通過(guò)copy()deepcopy()函數(shù)來(lái)分別提供淺拷貝和深拷貝功能揽浙。程序員可以通過(guò)在對(duì)象中定義__copy__()__deepcopy()__方法來(lái)修改模塊默認(rèn)的實(shí)現(xiàn)状婶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市馅巷,隨后出現(xiàn)的幾起案子膛虫,更是在濱河造成了極大的恐慌,老刑警劉巖钓猬,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稍刀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡敞曹,警方通過(guò)查閱死者的電腦和手機(jī)账月,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澳迫,“玉大人局齿,你說(shuō)我怎么就攤上這事¢系牵” “怎么了抓歼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拢锹。 經(jīng)常有香客問(wèn)我谣妻,道長(zhǎng),這世上最難降的妖魔是什么面褐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任拌禾,我火速辦了婚禮取胎,結(jié)果婚禮上展哭,老公的妹妹穿的比我還像新娘湃窍。我一直安慰自己,他們只是感情好匪傍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布您市。 她就那樣靜靜地躺著,像睡著了一般役衡。 火紅的嫁衣襯著肌膚如雪茵休。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天手蝎,我揣著相機(jī)與錄音榕莺,去河邊找鬼。 笑死棵介,一個(gè)胖子當(dāng)著我的面吹牛钉鸯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邮辽,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唠雕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吨述?” 一聲冷哼從身側(cè)響起岩睁,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揣云,沒(méi)想到半個(gè)月后捕儒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灵再,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年肋层,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翎迁。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栋猖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汪榔,到底是詐尸還是另有隱情蒲拉,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布痴腌,位于F島的核電站雌团,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏士聪。R本人自食惡果不足惜锦援,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剥悟。 院中可真熱鬧灵寺,春花似錦曼库、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叮称,卻和暖如春种玛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓤檐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赂韵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挠蛉。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓右锨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碌秸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绍移,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容