小資料池,編碼問題
阿新 • • 發佈:2018-12-03
1. 小資料池,
id
id() 檢視變數的記憶體地址
通過id()我們可以檢視到⼀一個變數量表⽰示的值在記憶體中的地址
小資料池針對的是: int, str, bool
在py檔案中幾乎所有的字串都會快取.
a = 10 b = 30 print(id(a))#1352229376 print(id(b))#1352230016 lst = ["胡辣湯"] print(id(lst))#3070023188872 lst = [] lst.append("胡辣湯") print(id(lst))#3070023188808 lst1 = [1,2,3]# 兩個物件 記憶體地址是不一樣的 lst2 = [1,2,3] print(id(lst1))#2114848899464 print(id(lst2))#2114848899272 s1 = "abc" #記憶體中沒有"abc",建立一個新的0.0001 s2 = "abc" #記憶體以有力"abc" 直接拿"abc" 0.00000001 print(id(s1),id(s2))#2447874555384 2447874555384 # 把字串的快取-> 小資料池 -> String iterning -> 常量池 -> 字串快取 #什麼資料會快取 #數字,字串,布林值 ==>不可變的資料型別 #字串.如一連串字串,幾乎都會被快取 s1 = "alex昨天上廁所沒關門. 韓紅衝進去了. 麵筋歌出來了" s2 = "alex昨天上廁所沒關門. 韓紅衝進去了. 麵筋歌出來了" print(id(s1),id(s2))#2431087496432 2431087496432 # 如果在py檔案中寫的字串. 幾乎都是快取的 # 在黑窗口裡的寫的幾乎都不會快取 # 不同的直譯器. 快取的機制也不一樣 # 優點: 可以幫我們快速的建立物件.節省記憶體. # 缺點: 快取如果過大. 響應速度會比較慢
is和==的區別
is 比較的是記憶體地址
== 比較的是內容
當兩個變數指向同一個物件的時候. is是True, ==也是True
lst1 = [1,2,3] lst2 = [1,2,3] print(id(lst1),id(lst2))#1634021425544 1634021425480 print(lst1==lst2)#Ture print(lst1 is lst2)#False s1 = "我是小錢" s2 = "我是小錢" print(id(s1),id(s2))#1603830872352 1603830872352 print(s1==s2)#True print(s1 is s2)#True
編碼的補充
在python3中. 預設的編碼是unicode,我們的字串就是unicode
在python2中. 預設的編碼是ASCII. Cpython.c語言的預設編碼是ASCII
unicode弊端:在儲存和傳輸的時候. 是很浪費的
在儲存和傳輸的時候不能直接使用unicode. 必須要對字串進行編碼. 編碼成bytes型別
bytes: 位元組形式的字串
1. encode(編碼格式) 編碼
2. decode(編碼格式) 解碼
bs = b'\xe6\x88\x91\xe4\xbb\x8a\xe5\xa4\xa9\xe9\x9d\x9e\xe5\xb8\xb8\xe7\x9a\x84\xe5\x9b\xb0' # 把這個bytes轉化成gbk的bytes s = bs.decode("utf-8") g = s.encode("gbk") print(g)