這篇文章主要介紹python不可變對(duì)象是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)建站專注于紫金企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城開發(fā)。紫金網(wǎng)站建設(shè)公司,為紫金等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
在python對(duì)象分類中已經(jīng) 介紹了python不可變對(duì)象,下面將列舉實(shí)例,詳細(xì)分析:
不可變類型(數(shù)字,字符串,元組,不可變集合):不支持原處修改。
引用
>>> a=345 >>> b=a >>> a is b True >>>
在python一切皆是對(duì)象,而對(duì)象是通過引用傳遞的。在賦值時(shí),不管這個(gè)對(duì)象是新創(chuàng)建的,還是一個(gè)已經(jīng)存在的,都是將該對(duì)象的引用賦值給變量。故這里a實(shí)際上和b是同一個(gè)對(duì)象,a is b為true!
數(shù)字類型(以int型為例)
一般,嘗試修改數(shù)字對(duì)象,實(shí)際上是新建一個(gè)數(shù)字對(duì)象,如下所示。
#新建數(shù)字對(duì)象1000 >>> id(1000) 53060472L #新建數(shù)字對(duì)象1000 >>> y = 1000 >>> id(y) 53060328L #嘗試操作修改數(shù)字對(duì)象,實(shí)際上生成新的數(shù)字對(duì)象 >>> y = y + 1 >>> y >>> id(y) 53058744L
(1)但有一個(gè)特例,對(duì)于小整數(shù)[-5, 256]。考慮到小整數(shù)可能頻繁使用,出于性能考慮,Python使用小整數(shù)對(duì)象緩沖池small_ints緩存了[-5,257)之間的整數(shù),該范圍內(nèi)的整數(shù)在Python系統(tǒng)中是共享的。小整數(shù)對(duì)象在py啟動(dòng)過程中初始化,這些個(gè)小整數(shù)對(duì)象的ob_refcnt不會(huì)改變且永遠(yuǎn)>0,所以在vm運(yùn)行過程中不會(huì)被銷毀,所以起到了緩沖的作用。
(2)對(duì)于超出了[-5, 257)之間的其他整數(shù),Python同樣提供了專門的緩沖池(通用整數(shù)對(duì)象的緩沖池),供這些所謂的大整數(shù)使用,避免每次使用的時(shí)候都要不斷的malloc分配內(nèi)存帶來的效率損耗。通過free-list,管理空閑空間。
(3)Python中的int對(duì)象就是c語言中l(wèi)ong類型數(shù)值的擴(kuò)展。
(4)整數(shù)對(duì)象回收時(shí),內(nèi)存并不會(huì)歸還給系統(tǒng),而是將其對(duì)象的ob_type指向free_list,供新創(chuàng)建的對(duì)象使用。
字符串類型
比如對(duì)于不可變對(duì)象str,進(jìn)行操作:
>>> a = 'abc' >>> id(a) 52053576L #引用新生成的對(duì)象 >>> b = a.replace('a','A') >>> id(b) 47950704L >>> id(a) 52053576L >>> b 'Abc'
要始終牢記的是,a是變量,而'abc'才是字符串對(duì)象!有些時(shí)候,我們經(jīng)常說,對(duì)象a的內(nèi)容是'abc',但其實(shí)是指,a本身是一個(gè)變量,它指向的對(duì)象的內(nèi)容才是'abc'。
tuple(元組)
當(dāng)你定義一個(gè)tuple時(shí),在定義的時(shí)候,tuple的元素就必須被確定下來。
最后來看一個(gè)“可變的”tuple:
>>> t = ('a', 'b', ['A', 'B']) >>> t ('a', 'b', ['A', 'B']) >>> hash(t) Traceback (most recent call last): File "", line 1, in hash(t) TypeError: unhashable type: 'list' >>> t[2][0] = 'X' >>> t[2][1] = 'Y' >>> t ('a', 'b', ['X', 'Y'])
表面上看,tuple的元素確實(shí)變了,但其實(shí)變的不是tuple的元素,而是list的元素。tuple一開始指向的list并沒有改成別的list,所以,tuple所謂的“不變”是說,tuple的每個(gè)元素,指向永遠(yuǎn)不變。即指向'a',就不能改成指向'b',指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的!
理解了“指向不變”后,要?jiǎng)?chuàng)建一個(gè)內(nèi)容也不變的tuple怎么做?那就必須保證tuple的每一個(gè)元素本身也不能變。
以上是python不可變對(duì)象是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!