說明
在python中處處皆物件,那麼具體細分又可以分為可變型別和不可變型別物件,今天來詳細討論一下。
is 和 == 的區別
先提前說一下is和==的區別以幫助理解。
is是判斷兩者是否屬於同一記憶體,即id(a) == id(b).而等於則是通過比較兩個值的大小是否相同。以下是例子:
a =
'hello world'
b ='hello world'
a == b #返回true
a is b #返回false
可變物件和不可變物件
由於python中萬物皆物件,而且對於呼叫不存在值呼叫這一說法,所有的呼叫的都是物件的引用,那麼根據其引用的物件是否能夠修改可以分為可變物件和不可變物件。
不可變物件
由於python中的變數存放的是物件引用,所以對於不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的。所以當對不可變物件重新賦值的時候,會重新開闢一段記憶體空間,並將位址引用指向新開闢的空間,原有的記憶體空間將被**。以下是乙個例子:
'''
'''print(id
(100))
# 140726575113072
a =100
print(id
(a))
# 140726575113072
b =100
print(id
(b))
# 140726575113072
a +=
2print(id
(a))
# 140726575113136
b =102
print(id
(b))
# 140726575113136
a和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)5)
id2 =
id(l)
print
(id1 == id2)
# true
list在發生變化後其指向的記憶體空間並沒有發生改變。 python 可變物件和不可變物件
變數沒有型別,那麼就意味著它可以隨意指向任何物件。python中的變數相當於乙個指標。當將乙個變數a賦值給另乙個變數b時,無論變數a指向的是可變物件還是不可變物件,變數b指向變數a指向的物件。例 alist 1 2,3 anolist alist id alist id anolist true b...
Python可變物件和不可變物件
python中一切皆物件,每個物件都有其唯一的id,對應的型別和值,其中id指的是物件在記憶體中的位置。根據物件的值是否可修改分為可變物件和不可變物件。其中,不可物件包括 數字,字串,tuple,frozenset 不可變集合 可變物件包括 list,dict,set python中的變數可以指向任...
Python 可變物件和不可變物件
python在heap中分配的物件分成兩類 可變物件和不可變物件。所謂可變物件是指,物件的內容是可變的,例如list。而不可變的物件則相反,表示其內容不可變。一 不可變物件 由於python中的變數存放的是物件引用,所以對於不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的。從上面得知,不...