眾所周知,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 ...