1、is和==的區別python
1,id( )緩存
id( )是python的一個內置函數,經過id( )咱們能夠查看到一個變量表的值在內存中的地址:函數
s = 2 print(id(s)) # 1514368064 s = 2 print(id(s)) # 1514368064 s = 'alex' print(id(s)) # 43156680 s = "alex" print(id(s)) # 43156680 lst = [1, 2, 4] print(id(lst)) # 43164168 lst1 = [1, 2, 4] print(id(lst1)) # 41362568 tup = (1, 2) tup1 = (1, 2) print(id(tup)) #39978312 print(id(tup1)) #39978376 # 咱們發現,數字和字符串的數據地址是同樣的. 列表和元組的數據地址是不同的.
小數據池(常量池):把咱們使用過的值存儲在小數據池中,供其餘數據使用。編碼
小數據池給數字和字符串使用,其餘數據類型不存在。spa
對於數字:-5~256是會被加到小數據池中的,每次使用都是同一個對象。code
對於字符串:對象
1,若是是帶特殊字符的,那麼不會被添加到小數據池,每次都是新的;blog
2,若是是單一字母*n的狀況,如「a」*20,在20個單位內(包含20個)是能夠的,超過20個單位就不會添加到小數據池;內存
注意(通常狀況下):在py文件中,若是你只是單純的定義一個字符串,那麼通常狀況下都會被添到小數據池中,咱們能夠這樣認爲:在使用字符串的時候,python會幫咱們把字符串進行緩存,在下次使用的時候直接指向這個字符串便可,能夠節省不少內存。utf-8
這個問題千萬不要糾結,由於官方沒有給出一個完美的結論和定論,因此只能是本身摸索
說了這麼多,這個id( )和is有什麼關係呢?注意,is比較的就是id( )計算出來的結果,因爲id( )是幫咱們查看某數據(對象)的內存地址,那麼is比較的就是數據(對象)的內存地址,即咱們經過is能夠查看兩邊使用的是不是同一個對象。
雙等(==)表示的是判斷是否相等,注意,這個雙等比較的是具體的值。
總結:==比較的是兩邊的值是否同樣;is比較的是內存地址是否同樣,便是不是同一個對象。
2、編碼的問題
1,python2中使用的是ASCII碼,因此不支持中文,若是須要在python2中更改編碼,須要在中文的開始編寫:
#-*- encoding:utf-8 -*-
編碼回顧:
1,ASCII:最先的編碼,裏面有英文大寫字母,小寫字母,數字,一些特殊字符,沒有中文。8個bit,1個byte。
2,GBK:中文國標碼,裏面包含了ASCII編碼,16個bit,2個byte。
3,unicode:萬國碼,裏面包含了全世界全部國家的文字編碼,32個bit,4個byte,包含了ASCII。
4,UTF-8:可變長度的萬國碼,是unicode的一種實現,最小字符佔8位
英文:8bit 1byte
歐洲文字:16bit 2byte
中文:24bit 3byte
綜上,除了ASCII碼之外,其餘信息不能直接轉換。
在python3的內存中,在程序運行階段使用的是unicode編碼,由於unicode是萬國碼,什麼內容均可以進行顯示,那麼在數據傳輸和存儲的時候因爲unicode比較浪費空間和資源,須要把unicode轉存成UTF-8或者CBK進行存儲,怎麼轉換呢,在python中能夠把文字信息進行編碼,編碼以後的內容就能夠進行傳輸了,編碼以後的數據是bytes類型的數據,其實啊,仍是原來的數據只是通過編碼以後表現形式發生了改變而已。
bytes 的表現形式:
1,英文 b'alex',英文的表現形式和字符串沒什麼兩樣;
2,中文b'\xe4\xb8\xad',這是一個漢字的UTF-8的bytes表現形式;
# 編碼: s = "alex" print(s.encode("utf-8")) # 將字符串編碼成UTF-8,結果爲:b'alex' print(s.encode("GBK")) # 將字符串編碼成GBK,結果爲:b'alex' s = "中" print(s.encode("UTF-8")) print(s.encode("GBK")) s1 = s.encode("UTF-8") # 中文編碼成UTF-8,結果爲:b'\xe4\xb8\xad' s2 = s.encode("GBK") # 中文編碼成GBK,結果爲:b'\xd6\xd0' # 解碼: print(s1.decode("UTF-8")) #結果爲:中 print(s2.decode("GBK")) #結果爲:中
注意:用什麼進行編碼就要用什麼進行解碼。
記住:英文編碼以後的結果是原字符串一致,中文編碼以後的結果根據編碼的不一樣,編碼結果也不一樣,咱們能確定,一箇中文UTF-8是3個字節。一個GBK的中文編碼是2個字節。