1. 程式人生 > >再談編碼---小數據池(概念)

再談編碼---小數據池(概念)

創建 val 遇到 什麽是 python2 規則 變量 函數 判斷

  

1. 小數據池
小數據池
在說小數據池之前. 我們先看一個概念. 什麽是代碼塊:
python程序是由代碼塊構成的. 一個代碼塊的文本作為python程序執行的單元.
代碼塊: 一個模塊, 一個函數, 一個類, 甚至每一個command命令都是一個代碼塊. 一個文件也是一個代碼塊, eval()和exec()執行的時候也是一個代碼塊

小數據池. 一種數據緩存機制. 也被稱為駐留機制.
小數據池只針對: 整數, 字符串串, 布爾值. 其他的數據類型不存在駐留機制

在python中對-5到256之間的整數會被駐留留在內存中. 將一定規則的字符串緩存. 在使用的時候,
內存中只會創建一個該數據的對象. 保存在小數據池中. 當使用的時候直接從數據池中獲取對象的內存引用.
而不需要創建一個新的數據. 這樣會節省更多的內存區域.

優點: 能夠提高一些字符串, 整數的處理速度. 省略的創建對象的過程.
缺點: 在‘池‘中創建或者插入新的內容會花費更多的時間.

對於數字: -5~256是會被加到小數據池中的. 每次使用都是同一個對象.
對於字符串:
1. 如果字符串的長度是0或者1, 都會默認進行緩存
2. 字符串長度大於1, 但是字符串中只包含字母, 數字, 下劃線時才會緩存
3. 用乘法的到的字符串.
①. 乘數為1, 僅包含數字, 字母, 下劃線時會被緩存. 如果包含其他字符, 而長度<=1 也會被駐存,
②. 乘數大於1 . 僅包含數字, 字母, 下劃線這個時候會被緩存. 但字符串長度不能大於20
4. 指定駐留. 我們可以通過sys模塊中的intern()函數來指定要駐留的內容.

在代碼塊內的緩存機制是不一樣的. 在執行同一個代碼塊的初始化對象的命令時, 會檢查是否其值是否已經存在,
如果存在, 會將其重用. 換句句話說: 執行同一個代碼塊時, 遇到初始化對象的命令時,
他會將初始化的這個變量與值存儲在一個字典中, 在遇到新的變量時, 會先在字典中查詢記錄,
如果有同樣的記錄那麽它會重復使用這個字典中的之前的這個值. 所以在你給出的例子中, 文件執行時(同一個代碼塊) 會把a, b兩個變量指向同一個對象.
如果是不同的代碼塊, 他就會看這個兩個變量是否是滿足小數據池的數據, 如果是滿足小數據池的數據則會指向同一個地址.
所以: a, b的賦值語句分別被當作兩個代碼塊執行, 但是他們不滿足小數據池的數據所以會得到兩個不同的對象, 因而is判斷返回False.

2. is和==的區別
1. id()
通過id()我們可以查看到?一個變量表示的值在內存中的地址.
s = ‘alex‘
print(id(s)) # 4326667072
2. is和==
== 判斷左右兩端的值是否相等. 是不是一致.
is 判斷左右兩端內容的內存地址是否一致. 如果返回True, 那可以確定這兩個變量使用的是同一個對象

我們可以這樣認為. 如果內存地址相同. 那麽值一定是相等的. 如果值相等. 則不一定是同一個對象


3. 編碼的問題
1. python2中默認使用的是ASCII碼. 所以不支持中文. 如果需要在Python2中更改編碼.
需要在文件的開始編寫:
# -*- encoding:utf-8 -*-
2. python3中: 內存中使用的是unicode碼.
編碼回顧:
1. ASCII : 最早的編碼. 裏面有英文大寫字母, 小寫字母, 數字, 一些特殊字符. 沒有中文,
8個01代碼, 8個bit, 1個byte
2. GBK: 中文國標碼, 裏面包含了了ASCII編碼和中文常用編碼. 16個bit, 2個byte
3. UNICODE: 萬國碼, 裏面包含了全世界所有國家文字的編碼. 32個bit, 4個byte, 包含了ASCII
4. UTF-8: 可變長度的萬國碼. 是unicode的一種實現. 最小字符占8位
1.英文: 8bit 1byte
2.歐洲文字:16bit 2byte
3.中文:24bit 3byte
綜上, 除了了ASCII碼以外, 其他信息不能直接轉換.


encode("GBK") # 編碼
decode("GBK") # 解碼

*****************
把GBK轉換成UTF-8
先把GBK轉化成Unicode
再將Unicode轉化成UTF-8

再談編碼---小數據池(概念)