Python魔法快取,以數字開始

2022-08-12 21:00:16 字數 1531 閱讀 2136

眾所周知,python是弱型別的指令碼語言,變數的定義是不用宣告型別的。

a = 1
python所有數字的本質都是物件, 他們是不可改變的資料型別,這意味著改變量字資料型別會分配乙個新的物件。 而變數名實際上建立了乙個引用指向該數字。

我們可以用del語句刪除該引用。

a = 1

print(a)

>>> 1

del a

print(a)

>>>traceback (most recent call last):

file "", line 1, in nameerror: name 'a' is not defined

那麼就有個問題,python直譯器如果每次都判斷型別再建立引用,豈不是很慢?

所以python快取了[-5,256]範圍內常用的整數 ,他們不會被垃圾**機制**。於是我們在python shell裡輸入如下**,會產生神奇的現象。

>>> a = 1

>>> b = 1

>>> a == b

>>> true

>>> a is b

>>> true

>>> a = 1000

>>> b = 1000

>>> a == b

>>> true

>>> a is b

>>> false

所以期望該範圍內的整數也是相同的,可以理解為兩個變數建立了同乙個引用。"=="比較的是二者的引用物件的內容。"is"比較的是兩個引用物件的id,也就是比較兩個物件是否為同乙個例項化物件,是否指向同乙個記憶體位址。

但是,如果把**放入同乙個檔案。結果會大不相同。

a = 300

b = 300

print(a is b)

>>> true

簡單理解,python直譯器會分析整個檔案,做出如下舉動:

python在執行同乙個**塊的初始化物件的命令時,會檢查是否其值是否已經存在,如果存在,會將其重用。

那麼哪些變數會有以上機制呢?

例如,

a = "a"

b = "a"

print(a is b)

>>> true

但是字典並不會

a = 

b =

print(a is b)

>>> false

而shell中只會一行一行的處理資料,所以無法達到檔案的效果。但是如果我們在shell裡這麼寫。說明python直譯器在讀取第一行的時候,分析了兩個變數的值,並知道二者相等,所以引用到同一物件。

>>> a = 1000;b = 1000

>>> a is b

>>> true

至於更底層的原因,作者還不太知道,在這兒先填個坑,學成之後再解釋。

python 魔法方法 python常用魔法方法

in 1 其實 str 相當於是str 方法 而 repr 相當於repr 方法。str是針對於讓人更好理解的字串格式化,而repr是讓機器更好理解的字串格式化。class test def init self,word self.word word def str self return my n...

python 魔法方法不會 Python 魔法方法

基礎 如果你想 所以,你寫 python呼叫 初始化乙個例項x myclass x.init 作為乙個字串的 官方 表示repr x x.repr 作為乙個字串str x x.str 作為位元組陣列bytes x x.bytes 作為格式化字串format x,format spec x.forma...

python的魔法 Python 魔法方法

先給個例子 class frenchdeck ranks str n for n in range 2,11 list jqka suits spades diamonds clubs hearts split def init self self.cards card rank,suit for ...