Python中的“可變對象”和“不可變對象”

1.jpg

寫在前面

“Python 一切皆對象沐鼠!”中的“對象”是“廣義對象”绳军,即萬物皆對象五督!
本文所要討論的“可變對象”和“不可變對象”中的“對象”是“狹義對象”彰导,即在內(nèi)存中真正存在的對象蛔翅!


“不可變對象”和“可變對象”的區(qū)別

不可變對象:對象一旦在內(nèi)存中生成后,它的值是不能被修改的位谋,若要得到“不同值”的新對象山析,只能通過重新分配新內(nèi)存創(chuàng)建新對象的方法!
可變對象:對象在內(nèi)存中生成后掏父,它的值可以被修改盖腿!若要得到“不同值”的新對象,既可以通過重新分配新內(nèi)存創(chuàng)建新對象的方法损同,也可以在原對象的基礎(chǔ)上直接修改值翩腐!(注意,可變對象并不意味著一定要在原對象上進行操作膏燃!)

下圖清晰展示了兩者的區(qū)別茂卦。對于不可變對象,執(zhí)行a=1時组哩,先生成一個對象1等龙,然后將a指向該對象;執(zhí)行a=2時伶贰,在新內(nèi)存中生成一個對象2蛛砰,然后將a指向這個新對象,如果原對象1沒有其他變量指向它黍衙,那么將被銷毀泥畅,釋放內(nèi)存!
對于可變對象琅翻,可在原值的基礎(chǔ)上進行修改位仁,無需生成新對象就可以得到新值。

可變和不可變對象比較.jpg

不可變對象:int方椎、字符串(str)聂抢、float、元組(tuple)棠众、數(shù)值型(number)琳疏、空(None)
可變對象:列表(list)、字典(dict)、集合(set)


為什么要分可變和不可變對象空盼?

廖雪峰博客:“為什么要設(shè)計str疮薇、None這樣的不變對象呢?因為不變對象一旦創(chuàng)建我注,對象內(nèi)部的數(shù)據(jù)就不能修改按咒,這樣就減少了由于修改數(shù)據(jù)導(dǎo)致的錯誤。此外但骨,由于對象不變励七,多任務(wù)環(huán)境下同時讀取對象不需要加鎖,同時讀一點問題都沒有奔缠。我們在編寫程序時掠抬,如果可以設(shè)計一個不變對象,那就盡量設(shè)計成不變對象校哎×讲ǎ”


★★必須要注意的問題

前面已經(jīng)提到,對于不可變對象闷哆,是不能在原對象的基礎(chǔ)上修改值的腰奋;對于可變對象,則可以在原對象的基礎(chǔ)上修改值抱怔,但這并不意味著所有操作都要在原對象的基礎(chǔ)上進行劣坊!見下例:

(情況1)在原對象上修改
>>>a = [1,2,3]
>>>print(id(a))
>>>a += [4]
>>>print(id(a))
>>>print(a)
36220232 #原對象地址
36220232 #依舊是原對象地址
[1, 2, 3, 4]

(情況2)在產(chǎn)生了新對象
a = [1,2,3]
print(id(a))
a = a + [4]
print(id(a))
print(a)
36244296 #原對象地址
36244232 #產(chǎn)生了新對象
[1, 2, 3, 4]

上面兩種情況,唯一的差別是前者a += [4]屈留,后者a = a + [4]局冰,結(jié)果都得到了新的列表[1,2,3,4]。但兩種情況的內(nèi)存處理過程是完全不同的灌危,前者在原對象上進行康二,而后者產(chǎn)生了新對象!
這兩個例子的目的是為了說明勇蝙,對于可變對象而言沫勿,有各種各樣的方式可以對其進行操作(增加、刪除浅蚪、插入藕帜、排序、反向等等)惜傲,這些操作有些會在原對象上進行,有些會新建一個新對象贝攒,編程時必須要搞清楚具體情況盗誊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哈踱,更是在濱河造成了極大的恐慌荒适,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件开镣,死亡現(xiàn)場離奇詭異刀诬,居然都是意外死亡,警方通過查閱死者的電腦和手機邪财,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門陕壹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人树埠,你說我怎么就攤上這事糠馆。” “怎么了怎憋?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵又碌,是天一觀的道長。 經(jīng)常有香客問我绊袋,道長毕匀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任癌别,我火速辦了婚禮期揪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘规个。我一直安慰自己凤薛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布诞仓。 她就那樣靜靜地躺著缤苫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墅拭。 梳的紋絲不亂的頭發(fā)上活玲,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音谍婉,去河邊找鬼舒憾。 笑死,一個胖子當(dāng)著我的面吹牛穗熬,可吹牛的內(nèi)容都是我干的镀迂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼唤蔗,長吁一口氣:“原來是場噩夢啊……” “哼探遵!你這毒婦竟也來了窟赏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤箱季,失蹤者是張志新(化名)和其女友劉穎涯穷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藏雏,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡拷况,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掘殴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赚瘦。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杯巨,靈堂內(nèi)的尸體忽然破棺而出蚤告,到底是詐尸還是另有隱情,我是刑警寧澤服爷,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布杜恰,位于F島的核電站,受9級特大地震影響仍源,放射性物質(zhì)發(fā)生泄漏心褐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一笼踩、第九天 我趴在偏房一處隱蔽的房頂上張望逗爹。 院中可真熱鬧,春花似錦嚎于、人聲如沸掘而。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袍睡。三九已至,卻和暖如春肋僧,著一層夾襖步出監(jiān)牢的瞬間斑胜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工嫌吠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留止潘,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓辫诅,卻偏偏與公主長得像凭戴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泥栖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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