1. id 和 ==
- id:
id
是一個內建的函式,可以檢視變數存放的記憶體地址(實際上不是真正的實體地址,這裡暫時這樣理解),用於判斷是變數否屬指向了同一塊記憶體地址 - ==:== 可以用於判斷兩個變數的值是否相等,這個在之前的例子中也有用過
下面來看幾個例子,以及具體的使用方法:
In [1]: a = `abc`
In [2]: b = `abc`
In [3]: a == b
Out[3]: True
In [4]: a is b
Out[4]: True
In [5]: c = 100
In [6]: d = 100
In [7]: c == d
Out[7]: True
In [8]: c is d
Out[8]: True
In [9]:
通過上面的例子可以總結出:字串和數字在之前有定義過的話,後續再用到這個變數時,不會再分配記憶體,而是直接把新的變數直接指向之前定義過的值,因此使用is
判斷時結果都為True,這種機制被稱作為快取機制。但是這裡也有比較坑的一點,我們再來看下面的例子:
In [9]: c = 1000
In [10]: d = 1000
In [11]: c is d
Out[11]: False
In [12]:
同樣是數字,但是100和1000的結果卻不一樣,這個要根據下面的一個知識點來看。
2. 小資料池
通過上面的例子可以看出,100和1000的值在經過相同的運算之後得到不同的結果,那麼我們可以這樣認為:如果記憶體地址一樣,那麼對應的值一定是相等的,但是反過來值一樣的話記憶體地址不一定一樣;我們先在來看幾個例子:
In [15]: a = -5
In [16]: b = -5
In [17]: a is b
Out[17]: True
In [18]: c = -6
In [19]: d = -6
In [20]: c is d
Out[20]: False
In [21]: c = 300
In [22]: d = 300
In [23]: c is d
Out[23]: False
In [24]:
這種現象是因為小資料池的存在。小資料池(非官方解釋):是一種快取機制,也被稱為駐留機制,其他語言中也有類似的機制,他會把資料儲存起來方便下次賦值時使用,以避免多個記憶體存放相同值的元素。
小資料池對資料的處理方法:
- 小資料池只針對數字、字串和布林值有效
- 數字的處理:在python中對-5到256之間的整數會被駐留在記憶體中. 將⼀定規則的字串快取;
- 對字串的處理:如果字串的⻓度是0或者1, 都會預設進⾏快取;字串⻓度⼤於1, 但是字串中只包含字⺟, 數字, 下劃線時才會快取
使用小資料池的優缺點:
- 優點: 能夠提⾼⼀些字串, 整數的處理速度. 省略的建立物件的過程.
- 缺點: 在`池`中建立或者插入新的內容會花費更多的時間.
3. 編碼和解碼
編碼回顧:
- ASCII:是最早的一種編碼,是其他編碼的基礎,佔用8bit,1byte
- GBK:中文國標碼,16bit,2byte
- Unicode:萬國碼,包含了全世界各國的語言,32bit,4byte
- UTF-8:可變的Unicode,是Unicode的一種實現
- 英文:8bit,1byte
- 歐洲文字:16bit, 2byte
- 中文:24bit,3byte
在網路傳輸和檔案儲存中,經常需要在各種編碼之間轉換,最常用的如UTF-8和Unicode等。
Unicode的表現形式:即python程式儲存在記憶體中的字串
byte表現的形式:
- 英文:b`i like python`,除了前面加b之外跟普通字串一樣
- 中文:b`xe4xb8xad`
字元編碼之間的轉換使用encode和decode操作:
In [24]: a = `i like python`
In [25]: b = `我喜歡python`
In [26]: a.encode(`utf-8`)
Out[26]: b`i like python`
In [27]: b.encode(`utf-8`) # 編碼成utf-8字元
Out[27]: b`xe6x88x91xe5x96x9cxe6xacxa2python`
In [28]: c = b`xe6x88x91xe5x96x9cxe6xacxa2python`
In [29]: c.decode(`utf-8`) # 以utf-8的編碼來解碼
Out[29]: `我喜歡python`
In [30]: b
Out[30]: `我喜歡python`
In [31]: b.encode(`GBK`)
Out[31]: b`xcexd2xcfxb2xbbxb6python`
In [32]: e = b`xcexd2xcfxb2xbbxb6python`
In [33]: e.decode(`GBK`).encode(`utf-8`) # 把GBK編碼轉換成UTF-8編碼
Out[33]: b`xe6x88x91xe5x96x9cxe6xacxa2python`
In [34]: f = e.decode(`GBK`).encode(`utf-8`)
In [35]: f.decode(`utf-8`)
Out[35]: `我喜歡python`
In [36]: