python -- 小數據池 is和 == 再談編碼

一、小數據池
python程序是由代碼塊構成的,一個代碼塊的文本做爲python程序的執行單元。
代碼塊:一個模塊,一個函數,一個類,甚至一個command命令都是一個代碼塊,一個文件也是一個代碼塊,eval()和exec()執行的時候也是代碼塊。
什麼是命令行?
咱們再控制檯CMD中輸入python進入的就是python的command模式。
 
一個command命令就是一個代碼塊

 

小數據池:一種數據緩存機制,也被稱爲駐留機制,也至關於常量池。(string  iterning)
小數據池只正對:整數(int),字符串(str),布爾型(bool)(都是不可變的數據類型)
在py文件中,幾乎全部的字符都會緩存。
id() 查看變量的內存地址
a = 123
print(id(a))
# 1416592208

 

   

在python中 對-5到256之間的整數會被駐留在內存中,講必定規則的字符串緩存,在使用的時候,內存中只會建立一個該數據的對象,保存到小數池中,在使用的時候,直接從小數池中獲取對象的內存引用,而不須要建立一個新的數據,這樣會節省更多的內存區域。
 
優勢:可以提升一些字符串,證書的處理速度,省略建立對象的過程。
缺點:在小數據池中建立或者插入新的內容,會花費較多的時間。
 
對於數字:-1~256是會被加到小數池中,每一次使用都是同一對象。
 
對於字符串:
 
    一、若是字符串的長度是0 或者1,都會默認進行緩存。
    二、字符長度大於1,可是字符串中只包含數字,字母,下劃線時纔會緩存
    三、用到乘法的字符串,①乘數爲1,僅包含數字,字母,下劃線時纔會被緩存。若是包含其餘字符,而長度小於等於1 也會被駐存  ②乘數大於1,僅包含數字,字母,下劃線時會被緩存,但字符串長度不能大於20.
    四、指定駐留,咱們能夠經過sys模塊總的intern()函數來指定要駐留的內容。
 
 
二、is 和 ==
 
    == 判斷左右兩端的值是否相等,是否是一致,(比較內容)
    is  判斷左右兩端的內存地址是否相等,若是返回 True,那能夠肯定這兩個變量使用的是同一個對象。(比較內存地址)
 
當兩個變量指向同一對象時,is 是 True  ==也是True

 

若是在py 文件中寫的字符串,幾乎都是緩存的,在cmd中寫的幾乎都不會緩存。 python

a = 257
b = 257
print(id(a))      # 1707735307344
print(id(b))     # 1707735307344
print(a is b)    # True

 

  兩個對象 內存地址是不同的緩存

lst1 = [1,2,3] # 兩個對象 內存地址是不同的
lst2 = [1,2,3]
print(id(lst1)) # 2748225600840
print(id(lst2)) # 2748225627144

 

  

在建立字符串以前,會先去小數池比對,是否已經存在了該字符串,若是存在了,就再也不建立新的了,直接拿原來存在的數據,省略掉反覆重複建立字符串的過程,節約內存。
 
 
三、編碼的補充
 
   一、回顧編碼
 
           ASCII:最先的編碼,裏邊有英文大寫字母,英文小寫字母,數字,一些特殊字符,沒有中文, 8bit,一個byte
           GBK:包含ASCII,中文(主要),日文,韓文,繁體文字。16bit ,2byte
           unicode:萬國碼,包含ASCII,gbk,big5. ...32bit,  4byte
           UTF-8:可變長度的unicode
                一、英文: 8bit ,1 byte
                二、歐洲文字:16bit , 2byte
                三、中文: 24bit , 3byte
不一樣的編碼間不能隨意轉化,須要經過媒介(unicode)轉化。
在python3中,默認的編碼是unicode,咱們的字符串就是unicode
在python2 中,默認的編碼是ASCII,Cpython,c語言的默認編碼是ASCII
 
unicode的弊端:在存儲和傳數數據的時候不能直接使用unicode,必需要對字符串進行編碼,編碼成ASCII類型。
bytes:字節形式的字符串,不是給人看的,是給機器用的。非ASCII中的內容,展現的時候都是 \x..若是是ASCII中的內容,原樣輸出。
 
一、encode(編碼格式) 編碼
二、decode(編碼格式) 解碼
 
UTF-8 和GBK是不能直接轉化的,必須使用unicode來轉化。
m = '今天晚上想看什麼書!'
a = m.encode('gbk')
print(a)
b = m.encode('utf-8')
print(b)
 
# b'\xbd\xf1\xcc\xec\xcd\xed\xc9\xcf\xcf\xeb\xbf\xb4\xca\xb2\xc3\xb4\xca\xe9\xa3\xa1'
# b'\xe4\xbb\x8a\xe5\xa4\xa9\xe6\x99\x9a\xe4\xb8\x8a\xe6\x83\xb3\xe7\x9c\x8b\xe4\xbb\x80\xe4\xb9\x88\xe4\xb9\xa6\xef\xbc\x81'
 
相關文章
相關標籤/搜索