python學習筆記:第6天 小資料池和編碼轉換

Chocolate、M發表於2018-10-24

1. id 和 ==

  • idid是一個內建的函式,可以檢視變數存放的記憶體地址(實際上不是真正的實體地址,這裡暫時這樣理解),用於判斷是變數否屬指向了同一塊記憶體地址
  • ==:== 可以用於判斷兩個變數的值是否相等,這個在之前的例子中也有用過

下面來看幾個例子,以及具體的使用方法:

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]:

相關文章