在Python中,無(wú)論你把對(duì)象做為參數(shù)傳遞,做為函數(shù)返回值,都是引用傳遞的,。 標(biāo)準(zhǔn)庫(kù)中的copy模塊提供了兩個(gè)方法來(lái)實(shí)現(xiàn)拷貝.一個(gè)方法是copy(shallow copy),它返回和參數(shù)包含內(nèi)容一樣的對(duì)象。 淺拷貝是指拷貝的只是原對(duì)象元素的引用,換句話說(shuō),,淺拷貝產(chǎn)生的對(duì)象本身是新的,,但是它的內(nèi)容不是新的,只是對(duì)原對(duì)象的一個(gè)引用。這里有個(gè)例子
為什么b的第二個(gè)元素沒(méi)有變成1呢?因?yàn)閿?shù)字在python中是不可變類(lèi)型??! 這個(gè)順便回顧下Python標(biāo)準(zhǔn)類(lèi)型的分類(lèi):
如果你希望復(fù)制一個(gè)容器對(duì)象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,這個(gè)方法會(huì)消耗一些時(shí)間和空間,不過(guò),如果你需要完全復(fù)制,這是唯一的方法.
對(duì)于一般的淺拷貝,使用copy.copy就可以了,當(dāng)然,你需要了解你要拷貝的對(duì)象.要復(fù)制列表L,使用list(L),要復(fù)制一個(gè)字典d,使用dict(d),要復(fù)制一個(gè)集合s,使用set(s),這樣,我們總結(jié)出一個(gè)規(guī)律,如果你要復(fù)制一個(gè)對(duì)象o,它屬于內(nèi)建的類(lèi)型t,那么你可以使用t(o)來(lái) 獲得一個(gè)拷貝.dict也提供了一個(gè)復(fù)制版本,dict.copy,這個(gè)和dict(d)是一樣,我推薦你使用后者,這個(gè)使得代碼更一致,而且還少幾個(gè)字符. 注意你不用復(fù)制不可修改對(duì)象(string,數(shù)字,元組),因?yàn)槟悴挥脫?dān)心修改它們.如果你想嘗試一下復(fù)制,依然會(huì)得到原來(lái)的.雖然無(wú)傷大雅,不過(guò)真的浪費(fèi)盡力.
|
|