is与==的恩怨、编码的详解
一、is和==的區別:
1、id()函數
通過id()可以查看到?一個變量表?的值在內存中的地址.
#字符串 a1 = "alex" a2 = "alex" print(id(a1),id(a2)) #2250772541544 2250772541544 #int a1 = 123 a2 = 123 print(id(a1),id(a2)) #2004253536 2004253536 #bool a1 = True a2 = True print(id(a1),id(a2)) #2003759264 2003759264 #字符串、int、bool等的數據地址都是一樣的#列表 a1 = ["張無忌","周芷若"] a2 = ["張無忌","周芷若"] print(id(a1),id(a2)) #2028760057352 2028760058056 #元組 a1 = ("扶搖","楊冪") a2 = ("扶搖","楊冪") print(id(a1),id(a2)) #1494052752008 1494052752072 #字典 a1 = {"楚喬":"趙麗穎","宇文玥":"林更新"} a2 = {"楚喬":"趙麗穎","宇文玥":"林更新"} print(id(a1),id(a2)) #1620881530672 1620881530744
#列表、元組、字典等數據地址都不一樣
#結果?致, 但是在終端中是不?致的. 所以在python中,命令行代碼和py文 件中的代碼運行的效果可能是不一樣的
#?數據池(常量池): 把我們使用過的值存儲在小數據池中.供其他的變量使用. 小數據池給數字和字符串串使用, 其他數據類型不存在.
對于數字: -5~256是會被加到小數據池中的. 每次使用都是同一個對象. 對于字符串:
1. 如果是純文字信息和下劃線. 那么這個對象會被添加到小數據池
2. 如果是帶有特殊字符的. 那么不會被添加到小數據池. 每次都是新的
3. 如果是單一字?母*n的情況. 'a'*20, 在20個單位內是可以的. 超過20個單位就不會添加 到小數據池中
#注意(一般情況下): 在py?文件中. 如果你只是單純的定義一個字符串. 那么一般情況下都是會 被添加到小數據池中的.
我們可以這樣認為: 在使用字符串的時候, python會幫我們把字符串 進行緩存, 在下次使用的時候直接指向這個字符串即可. 可以節省很多內存.
? 2、==判斷兩邊的值 ? ? #雙等表?的是判斷是否相等, 注意. 這個雙等比較的是具體的值.?不是內存地址
3、is 判斷內存的地址
id()和is有什么關系呢. 注意. is比較的就是id()計算出來的結果. 由于id是幫我 們查看某數據(對象) 的內存地址. 那么is比較的就是數據(對象)的內存地址. 最終我們通過is可以查看兩個變量使?用的是否是同一個對象.
a1 = "殺阡陌" a2 = "殺阡陌" print(a1 == a2) #True print(a1 is a2) #True # 原因是有小數據池的存在 導致兩個變量指向的是同一個對象 a1 = [1,2,3] a2 = [1,2,3] print(a1 == a2) #True 值是一樣的 print(a1 is a2) #True 內存地址是不一樣的
編碼的回顧:
1、ASCII:有字母的大小寫,數字,特殊字符。8bit,1byte
2、GBK:中文,16bit,2byte,兼容ASCII
3、unicode:萬國碼,32bit,4byte,兼容ASCII
4、utf-8:長度可變的unicode。英文:8bit,1byte。歐洲:16bit,2byte。中文:24bit,3byte。
python2和python3的區別
python2:?python2中默認使?的是ASCII碼. 所以不?持中?.? 如果需要在Python2中更改編碼. 需要在?件的開始編寫:# -*- encoding:utf-8 -*
- 或coding=utf-8
python3:在python3的內存中. 在程序運?階段. 使?的是unicode編碼. 因為unicode是萬國碼. 什么內容都可以進?顯?. 那么在數據傳輸和存儲的時候由于unicode比較浪費空間和資源. 需要把 unicode轉存成UTF-8或者GBK進?存儲. 怎么轉換呢. 在python中可以把?字信息進?編碼. 編碼之后的內容就可以進?傳輸了了. 編碼之后的數據是bytes類型的數據.其實啊. 還是原來的 數據只是經過編碼之后表現形式發?了改變?已.
bytes數據類型:表現形式:1. 英? ? b'alex'? 英?的表現形式和字符串沒什么兩樣
2. 中?? b'\xe4\xb8\xad' 這是?個漢字的UTF-8的bytes表現形式
二、encode: 編碼? (?encode()編碼之后的內容是bytes類型的數據)
s = "alex" print(s.encode("utf-8")) #將字符串改為UTF-8 print(s.encode("GBK")) #將字符串改為GBK #結果:b'alex'b'alex's = "中" print(s.encode("utf-8")) #將字符串改為UTF-8 print(s.encode("GBK")) #將字符串改為GBK #結果:b'\xe4\xb8\xad'b'\xd6\xd0' #記住: 英?編碼之后的結果和源字符串一致. 中?編碼之后的結果根據編碼的不同. 編碼結果 也不同. 我們能看到.?個中?的UTF-8編碼是3個字節. ?一個GBK的中?文編碼是2個字節. 編碼之后的類型就是bytes類型.
在?絡傳輸和存儲的時候我們python是保存和存儲的bytes類型. 那么在對?方接收的時候. 也是接收的bytes類型的數據.
我們可以使用decode()來進?解碼操作. 把bytes類型的數據還原回我們熟悉的字符串:
三、decode:解碼:
s = "我是張無忌" print(s.encode("utf-8")) #編碼 結果:b'\xe6\x88\x91\xe6\x98\xaf\xe5\xbc\xa0\xe6\x97\xa0\xe5\xbf\x8c's1 = b'\xe6\x88\x91\xe6\x98\xaf\xe5\xbc\xa0\xe6\x97\xa0\xe5\xbf\x8c' print(s1.decode("utf-8")) #解碼 結果:我是張無忌四、編碼和解碼的時候都需要制定編碼格式.
s = "我喜歡碧瑤" bs = s.encode("GBK") #獲取到GBK文字 #把GBK轉換成UT-8,首先把GBK轉換成unicode.也就是需要解碼 print(bs) ss = bs.decode("GBK") #解碼 print(ss) #從新編譯成utf-8 bss = s.encode("utf-8") #從新編碼 print(bss)?
轉載于:https://www.cnblogs.com/LW-5208/articles/9283342.html
總結
以上是生活随笔為你收集整理的is与==的恩怨、编码的详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 自带截图工具快捷键盘
- 下一篇: intel i5处理器layout及原理