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