python學(xué)習(xí)記錄:?拷貝抄瑟、深拷貝/可變&不可變類(lèi)型/is與==區(qū)別

<Python 直接賦值、淺拷貝和深度拷貝解析>

直接賦值:其實(shí)就是對(duì)象的引用(別名)浅缸。

淺拷貝(copy):拷貝父對(duì)象轨帜,不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象。

深拷貝(deepcopy): copy 模塊的 deepcopy 方法衩椒,完全拷貝了父對(duì)象及其子對(duì)象蚌父。


對(duì)象賦值

淺拷貝

總結(jié)一下,當(dāng)我們使用下面的操作的時(shí)候毛萌,會(huì)產(chǎn)生淺拷貝的效果:

使用切片[:]操作

使用工廠函數(shù)(如list/dir/set)

使用copy模塊中的copy()函數(shù)

深拷貝

對(duì)于對(duì)象中的元素苟弛,深拷貝都會(huì)重新生成一份(有特殊情況,下面會(huì)說(shuō)明)阁将,而不是簡(jiǎn)單的使用原始元素的引用(內(nèi)存地址)

拷貝的特殊情況

其實(shí)膏秫,對(duì)于拷貝有一些特殊情況:

對(duì)于非容器類(lèi)型(如數(shù)字、字符串做盅、和其他'原子'類(lèi)型的對(duì)象)沒(méi)有拷貝這一說(shuō)

也就是說(shuō)荔睹,對(duì)于這些類(lèi)型狸演,"obj is copy.copy(obj)" 、"obj is copy.deepcopy(obj)"

如果元組變量只包含原子類(lèi)型對(duì)象僻他,則不能深拷貝

對(duì)象的賦值和拷貝宵距,以及它們之間的差異:

Python中對(duì)象的賦值都是進(jìn)行對(duì)象引用(內(nèi)存地址)傳遞

使用copy.copy(),可以進(jìn)行對(duì)象的淺拷貝吨拗,它復(fù)制了對(duì)象满哪,但對(duì)于對(duì)象中的元素,依然使用原始的引用.

如果需要復(fù)制一個(gè)容器對(duì)象劝篷,以及它里面的所有元素(包含元素的子元素)哨鸭,可以使用copy.deepcopy()進(jìn)行深拷貝

對(duì)于非容器類(lèi)型(如數(shù)字、字符串娇妓、和其他'原子'類(lèi)型的對(duì)象)沒(méi)有被拷貝一說(shuō)

如果元組變量只包含原子類(lèi)型對(duì)象像鸡,則不能深拷貝。

<Python的可變類(lèi)型與不可變類(lèi)型>

Python的每個(gè)對(duì)象都分為可變和不可變哈恰,主要的核心類(lèi)型中只估,數(shù)字、字符串着绷、元組是不可變的蛔钙,列表、字典是可變的荠医。

對(duì)不可變類(lèi)型的變量重新賦值吁脱,實(shí)際上是重新創(chuàng)建一個(gè)不可變類(lèi)型的對(duì)象,并將原來(lái)的變量重新指向新創(chuàng)建的對(duì)象(如果沒(méi)有其他變量引用原有對(duì)象的話(huà)(即引用計(jì)數(shù)為0)彬向,原有對(duì)象就會(huì)被回收)兼贡。

不可變類(lèi)型以int類(lèi)型為例:

實(shí)際上 i += 1 并不是真的在原有的int對(duì)象上+1,而是重新創(chuàng)建一個(gè)value為6的int對(duì)象娃胆,i引用自這個(gè)新的對(duì)象紧显。

通過(guò)id函數(shù)查看變量i的內(nèi)存地址進(jìn)行驗(yàn)證

可以看到執(zhí)行 i += 1 時(shí),內(nèi)存地址都會(huì)變化缕棵,因?yàn)閕nt 類(lèi)型是不可變的。

再改改代碼涉兽,但多個(gè)int類(lèi)型的變量值相同時(shí)招驴,看看它們內(nèi)存地址是否相同。

對(duì)于不可變類(lèi)型int枷畏,無(wú)論創(chuàng)建多少個(gè)不可變類(lèi)型别厘,只要值相同,都指向同個(gè)內(nèi)存地址拥诡。同樣情況的還有比較短的字符串触趴。

對(duì)于其他類(lèi)型則不同氮发,以浮點(diǎn)類(lèi)型為例,從代碼運(yùn)行結(jié)果可以看出它是個(gè)不可變類(lèi)型:對(duì)i的值進(jìn)行修改后冗懦,指向新的內(nèi)存地址爽冕。

修改代碼聲明兩個(gè)相同值的浮點(diǎn)型變量,查看它們的id披蕉,發(fā)現(xiàn)它們并不是指向同個(gè)內(nèi)存地址颈畸,這點(diǎn)和int類(lèi)型不同(這方面涉及Python內(nèi)存管理機(jī)制,Python對(duì)int類(lèi)型和較短的字符串進(jìn)行了緩存没讲,無(wú)論聲明多少個(gè)值相同的變量眯娱,實(shí)際上都指向同個(gè)內(nèi)存地址。)爬凑。

可變類(lèi)型的話(huà)扛吞,以list為例。

list在append之后兽愤,還是指向同個(gè)內(nèi)存地址抡爹,因?yàn)閘ist是可變類(lèi)型,可以在原處修改吱抚。

改改代碼百宇,當(dāng)存在多個(gè)值相同的不可變類(lèi)型變量時(shí),看看它們是不是跟可變類(lèi)型一樣指向同個(gè)內(nèi)存地址

從運(yùn)行結(jié)果可以看出秘豹,雖然a携御、b的值相同,但是指向的內(nèi)存地址不同既绕。我們也可以通過(guò)b = a 的賦值語(yǔ)句啄刹,讓他們指向同個(gè)內(nèi)存地址:

這個(gè)時(shí)候需要注意,因?yàn)閍凄贩、b指向同個(gè)內(nèi)存地址誓军,而a、b的類(lèi)型都是List疲扎,可變類(lèi)型昵时,對(duì)a、b任意一個(gè)List進(jìn)行修改椒丧,都會(huì)影響另外一個(gè)List的值壹甥。

代碼中,b變量append(4)壶熏,對(duì)a變量也是影響的句柠。輸出他們的內(nèi)存地址,還是指向同個(gè)內(nèi)存地址。

<python的可變類(lèi)型與不可變類(lèi)型>

我們?cè)谇把岳锩嬗刑岬降哪莻€(gè)奇怪的問(wèn)題溯职,很顯然精盅,那是共享了字符串的字面量,這種Cpython里面一個(gè)優(yōu)化策略谜酒,叫駐留(interning).CPython 還會(huì)在小的整數(shù)上使用這個(gè)優(yōu)化措施叹俏,防止重復(fù)的創(chuàng)建”熱門(mén)“數(shù)字,比如0甚带,-1她肯,和42等等,但是CPython不會(huì)駐留所有的字符串和整數(shù)鹰贵。比如如下的代碼

所以千萬(wàn)不要依賴(lài)字符串或者整數(shù)的駐留晴氨!比較字符串或者整數(shù)是否相等的時(shí),應(yīng)該使用== 而不是is. 駐留是python 解釋器內(nèi)部使用的一個(gè)特性


<python可變和不可變對(duì)象>

python函數(shù)的參數(shù)傳遞

當(dāng)傳過(guò)來(lái)的是可變類(lèi)型(list,dict)時(shí)碉输,我們?cè)诤瘮?shù)內(nèi)部修改就會(huì)影響函數(shù)外部的變量籽前。而傳入的是不可變類(lèi)型時(shí)在函數(shù)內(nèi)部修改改變量并不會(huì)影響函數(shù)外部的變量,因?yàn)樾薷牡臅r(shí)候會(huì)先復(fù)制一份再修改敷钾。

python使用的內(nèi)存回收機(jī)制是計(jì)數(shù)器回收枝哄,就是每塊內(nèi)存上有一個(gè)計(jì)數(shù)器,表示當(dāng)前有多少個(gè)對(duì)象指向該內(nèi)存阻荒。每當(dāng)一個(gè)變量不再使用時(shí)挠锥,就讓該計(jì)數(shù)器-1,有新對(duì)象指向該內(nèi)存時(shí)就讓計(jì)數(shù)器+1侨赡,當(dāng)計(jì)時(shí)器為0時(shí)蓖租,就可以收回這塊內(nèi)存了

值傳遞:表示傳遞直接傳遞變量的值,把傳遞過(guò)來(lái)的變量的值復(fù)制到形參中羊壹,這樣在函數(shù)內(nèi)部的操作不會(huì)影響到外部的變量

引用傳遞:我個(gè)人覺(jué)得可以把引用理解為一個(gè)箭頭蓖宦,這個(gè)箭頭指向某塊內(nèi)存地址,而引用傳遞油猫,傳遞過(guò)來(lái)的就是這個(gè)箭頭稠茂,當(dāng)你修改內(nèi)容的時(shí)候,就是修改這個(gè)箭頭所指向的內(nèi)存地址中的內(nèi)容情妖,因?yàn)橥獠恳彩侵赶蜻@個(gè)內(nèi)存中的內(nèi)容的睬关,所以,在函數(shù)內(nèi)部修改就會(huì)影響函數(shù)外部的內(nèi)容毡证。

<Python中is和==的區(qū)別>

在Python中一切都是對(duì)象电爹。

Python中對(duì)象包含的三個(gè)基本要素,分別是:id(身份標(biāo)識(shí))情竹、type(數(shù)據(jù)類(lèi)型)和value(值)。對(duì)象之間比較是否相等可以用==,也可以用is秦效。

is和==都是對(duì)對(duì)象進(jìn)行比較判斷作用的雏蛮,但對(duì)對(duì)象比較判斷的內(nèi)容并不相同。下面來(lái)看看具體區(qū)別在哪?

is比較的是兩個(gè)對(duì)象的id值是否相等阱州,也就是比較兩個(gè)對(duì)象是否為同一個(gè)實(shí)例對(duì)象挑秉,是否指向同一個(gè)內(nèi)存地址。

==比較的是兩個(gè)對(duì)象的內(nèi)容是否相等苔货,默認(rèn)會(huì)調(diào)用對(duì)象的__eq__()方法

為什么256時(shí)相同犀概, 而1000時(shí)不同?

因?yàn)槌鲇趯?duì)性能的考慮夜惭,Python內(nèi)部做了很多的優(yōu)化工作姻灶,對(duì)于整數(shù)對(duì)象,Python把一些頻繁使用的整數(shù)對(duì)象緩存起來(lái)诈茧,保存到一個(gè)叫small_ints的鏈表中产喉,在Python的整個(gè)生命周期內(nèi),任何需要引用這些整數(shù)對(duì)象的地方敢会,都不再重新創(chuàng)建新的對(duì)象曾沈,而是直接引用緩存中的對(duì)象。Python把這些可能頻繁使用的整數(shù)對(duì)象規(guī)定在范圍[-5, 256]之間的小對(duì)象放在small_ints中鸥昏,但凡是需要用些小整數(shù)時(shí)塞俱,就從這里面取,不再去臨時(shí)創(chuàng)建新的對(duì)象吏垮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末障涯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惫皱,更是在濱河造成了極大的恐慌像樊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旅敷,死亡現(xiàn)場(chǎng)離奇詭異生棍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)媳谁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)涂滴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晴音,你說(shuō)我怎么就攤上這事柔纵。” “怎么了锤躁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵搁料,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)郭计,這世上最難降的妖魔是什么霸琴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮昭伸,結(jié)果婚禮上梧乘,老公的妹妹穿的比我還像新娘。我一直安慰自己庐杨,他們只是感情好选调,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著灵份,像睡著了一般仁堪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上各吨,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天枝笨,我揣著相機(jī)與錄音,去河邊找鬼揭蜒。 笑死横浑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屉更。 我是一名探鬼主播徙融,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瑰谜!你這毒婦竟也來(lái)了欺冀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萨脑,失蹤者是張志新(化名)和其女友劉穎隐轩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體渤早,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡职车,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹊杖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悴灵。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骂蓖,靈堂內(nèi)的尸體忽然破棺而出积瞒,到底是詐尸還是另有隱情,我是刑警寧澤登下,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布茫孔,位于F島的核電站叮喳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缰贝。R本人自食惡果不足惜嘲更,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揩瞪。 院中可真熱鬧,春花似錦篓冲、人聲如沸李破。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗤攻。三九已至,卻和暖如春诽俯,著一層夾襖步出監(jiān)牢的瞬間妇菱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工暴区, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闯团,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓仙粱,卻偏偏與公主長(zhǎng)得像房交,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伐割,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354