(1)任何乙個物件a均有乙個唯一的id識別號,用內建函式id(a)來獲得該號。在cpython中,id(a)表示物件a在記憶體中的位址。
id(object) -> integer
return the identity of an object. this is guaranteed to be unique among
simultaneously existing objects. (hint: it's the object's memory address.)
可以用"is"語句判斷兩個物件的識別號是否一致,例如 a is b,而a == b是比較兩者的值。
(2)python中的變數可分為可變型別和不可變型別。
不可變型別包括:數字(int, float)、字串、元組、布林、日期
可變型別包括:列表、字典、集合
不可變型別表示不允許變數的值發生變化,如果改變了變數的值,相當於是新建了乙個物件。可變型別表示該型別的變數可以原地修改。
判斷變數的型別是可變型別還是不可變型別,可以通過修改該變數前後id值是否發生變化來判斷,如id發生變化,則為不可變型別,反之為可變型別。(注:元組不支援該操作,因為元組預設不可變)。
a = 3
print(id(a))
a = 4
print(id(a))
b = 'hello'
print(id(b))
b = 'hello world'
print(id(b))
c = [1,2,3]
print(id(c))
print(id(c))
d =
print(id(d))
d.pop('c')
print(id(d))
e=print(id(e))
e.add(4)
e.remove(1)
print(id(e))
以上三段**執行發現,修改列表、字典、集合變數的值時,變數的id值不發生任何改變,說明這三種資料型別均為可變型別。
(3)可變型別內部包含不可變型別的情況
a=['abc',1,2]
print(id(a),id(a[0]))
a[0] = 'efg'
print(id(a),id(a[0]))
執行結果:
322594056 12223552
322594056 325218816
說明修改可變型別變數列表內部的不可變物件字串時,列表的id不發生變化,但內部的不可變型別物件的字串物件的id值發生了變化。
(4)小資料池
a = 3
b = 3
print(id(a) == id(b))
執行結果:true
a = 300
b = 300
print(id(a) == id(b))
執行結果:false
python自動將-5~256的整數進行了快取,當你將這些整數賦值給變數時,並不會重新建立物件,而是使用已經建立好的快取物件。
對於字串變數,當字串的長度》1,且只含有大小寫字母,數字,下劃線時,才會預設駐留。當字串變數的長度為0或者1,使用小資料池。
a = 'hello_2020'
b = 'hello_2020'
print(id(a) == id(b))
a = 'hello world'
b = 'hello world'
print(id(a) == id(b))
執行結果:
true
false
對於bool變數同樣適用小資料池。
a = true
b = true
print(id(a) == id(b))
執行結果:
true
以上情況外,均不使用小資料池,例如:
a = [1,2,3,4]
b = [1,2,3,4]
print(id(a) == id(b))
執行結果:
false
(5)知識檢驗
例1:
a = 'abc'
a.capitalize()
print(a)
執行結果是 abc,為什麼不是abc?
例2:
a =[100,200,300]
print(a)
執行結果:none,為什麼不是[100, 200, 300, 400] python可變型別與不可變型別
學習版本3.5.2 python的基礎型別數值 字串和元組都是不可變型別,列表和字典時可變型別 1.number 字串 id 1 4297546560 id 2 4297546592 a 1 id a 4297546560 a 2 id a 4297546592 b 1 id b 429754656...
python可變型別與不可變型別
不可變資料型別在第一次宣告賦值的時候,會在記憶體中開闢一塊空間,用來存放這個變數被賦的值,而這個變數實際上儲存的,並不是被賦予的這個值,而是存放這個值所在空間的記憶體位址,通過這個位址,變數就可以在記憶體中取出資料了.所謂不可變就是說,我們不能改變這個資料在記憶體中的值,所以當我們改變這個變數的賦值...
Python 可變型別與不可變型別
可變型別 值改變,id不變,證明改的是原值,證明原值是可以被改變的 不可變型別 值改變,id也變了,證明是產生新的值,壓根沒有改變原值,證明原值是不可以被修改的 x 10print id x x 11 print id x 將x的值修改後,原值 10 無法被改變,在記憶體中建立新的位址儲存 11 並...