1. 程式人生 > >小資料池,編碼問題

小資料池,編碼問題

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)