python的可变对象和不可变对象
說明
在python中處處皆對象,那么具體細(xì)分又可以分為可變類型和不可變類型對象,今天來詳細(xì)討論一下。
is 和 == 的區(qū)別
先提前說一下is和==的區(qū)別以幫助理解。
is是判斷兩者是否屬于同一內(nèi)存,即id(a) == id(b).而等于則是通過比較兩個值的大小是否相同。以下是例子:
a = 'hello world' b = 'hello world' a == b #返回True a is b #返回False可變對象和不可變對象
由于python中萬物皆對象,而且對于調(diào)用不存在值調(diào)用這一說法,所有的調(diào)用的都是對象的引用,那么根據(jù)其引用的對象是否能夠修改可以分為可變對象和不可變對象。
- 其中可變對象為:list, set, dict
- 不可變對象為:int,string,float,tuple
不可變對象
由于Python中的變量存放的是對象引用,所以對于不可變對象而言,盡管對象本身不可變,但變量的對象引用是可變的。所以當(dāng)對不可變對象重新賦值的時候,會重新開辟一段內(nèi)存空間,并將地址引用指向新開辟的空間,原有的內(nèi)存空間將被回收。以下是一個例子:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' print(id(100)) # 140726575113072 a = 100 print(id(a)) # 140726575113072 b = 100 print(id(b)) # 140726575113072 a += 2 print(id(a)) # 140726575113136 b = 102 print(id(b)) # 140726575113136a和b為相同值時,其對應(yīng)的內(nèi)存空間是一致的;當(dāng)a值發(fā)生變化時,不是在原有內(nèi)存上進(jìn)行修改,而是重新開辟了內(nèi)存空間進(jìn)行修改,然后指向新的地址。但是需要注意的是,由于小數(shù)緩存機制,[-5,257]之間的整數(shù)使用的共用的緩存的空間,當(dāng)超過257時,即使相同的數(shù)值也會分配不同的地址空間。
可變對象
可變對象的引用指向了存儲空間的首地址,而且有關(guān)于list的meta信息和object是分開的,因此在list中可以存儲不同的數(shù)據(jù)類型,當(dāng)添加新元素時,會在meta中增加相應(yīng)的地址,實際上list名稱是地址引用的引用,因此在改變list內(nèi)容后,其指向的地址并不會發(fā)生改變。以下是一個例子:
l = [1,2,3,4] l2 = [1,2,3,4] print(l is l2) # id(l) == id(l2) false id1 = id(l) l.append(5) id2 = id(l) print(id1 == id2) # truelist在發(fā)生變化后其指向的內(nèi)存空間并沒有發(fā)生改變。
總結(jié)
以上是生活随笔為你收集整理的python的可变对象和不可变对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 直接赋值、浅拷贝和深度拷贝
- 下一篇: python生成迭代的用法