Python中可變對象和不可變對象

python中對象可分爲:可變對象和不可變對象
先從數據類型角度理解可變對象和不可變對象。

抽象數據類型的操作一般分爲三類:

1、構造操作: 這類操作主要是基於一些已知信息,產生這個類的實例對象。類似銀行進行開通賬戶

2、解析操作:這類操作是獲取對象的一些有用信息,其結果反應了對象的一些特徵,但返回的不是對象本身。類似銀行查詢賬戶餘額

3、變化操作 :這類操作是修改對象內部的信息和狀態。比如一個銀行賬戶進行轉賬操作

如果一個類型,具只具有1和2兩種操作,也就說只具有構造和解析操作,那麼這個類型就是不可變類型,這個類型的對象就是不可變對象
如果一個類型,具有1、2、3三種操作,這個類型就是可變類型,這個類型的對象就是可變對象。
不可變對象:對象所指向的內存中的值不能被改變,當改變這個變量的時候,原來指向的內存中的值不變,變量不再指向原來的值,而是開闢一塊新的內存,變量指向新的內存。
舉個例子:

>>> a=5
>>> print id(a)
140433054259208
>>> a= 4
>>> print id(a)
140433054259232
>>> print id(a),id(4)
140433054259232 140433054259232
>>> print id(a),id(5)
140433054259232 140433054259208
>>> 

打印的結果表明:不可變對象int的變量a改變後,未改變之前指向內存中5,改變後開闢一塊新內存指向4
由於是不可變對象,變量對應內存的值不允許被改變。當變量要改變時,實際上是把原來的值複製一份後再改變,開闢一個新的地址,astr再指向這個新的地址(所以前後astr的id不一樣),原來astr對應的值因爲不再有對象指向它,就會被垃圾回收。

再來看一下字符串str

>>> a='hello'
>>> print id(a)
4385118896
>>> a =a +' world'
>>> print a
hello world
>>> print id(a)
4385119040
結果是一樣的,也是開闢新內存,指向新內存中的值

可變對象:對象指向的內存中的值會改變,當更改這個變量的時候,還是指向原來內存中的值,並且在原來的內存值進行原地修改,並沒有開闢新的內存。

>>> list=[1,2,3,4]
>>> print id(list)
4384947808
>>> list[2]=5
>>> print list
[1, 2, 5, 4]
>>> print id(list)
4384947808

結果表明: 列表list在改變前後id並未發生改變,可變對象由於所指對象可以被修改,所以無需複製一份之後再改變,直接原地改變,所以不會開闢新的內存,改變前後id不變。

在Python中,數值類型int 、float、 字符串str 、元祖tuple、boole 都是不可變對象
列表list、集合set、字典dict都是可變對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章