python學習內容.06
本節主要內容: 1. is和==的區別 2. 編碼的問題
?一. is和==的區別 1. id() 通過id()我們可以查看到?一個變量量表?示的值在內存中的地址.
s = ‘alex‘ print(id(s)) # 4326667072 s = "alex" print(id(s)) # 4326667072
lst = [1, 2, 4] print(id(lst)) # 4326685768 lst1 = [1, 2, 4] print(id(lst1)) # 4326684360 # 我們發現. 字符串串的數據地址是?一樣的. ?而 列列表的數據地址是不不?一樣的. tup = (1, 2) tup1 = (1, 2) print(id(tup)) print(id(tup1)) print(id("哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵"*100)) print(id("哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵"*100)) s1 = "00000000000000000000000000000000000000000哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵" s2 = "00000000000000000000000000000000000000000哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵 呵呵" print(id(s1)) print(id(s2)) print(s1 is s2) a1 = str("alexalexalex"+"abcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcd ef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111a bcdefgabcdef1111abcdefg") print(id(a1)) a2 = str("alexalexalex"+"abcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcd ef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111a bcdefgabcdef1111abcdefg") print(id(a2)) s1 = "@1 2 " s2 = "@1 2 " print(id(s1)) print(id(s2)) # 結果?一致, 但是在終端中是不不?一致的. 所以在python中,命令?行行代碼和py?文 件中的代碼運?行行的效果可能是不不?一樣的
?小數據池(常量量池): 把我們使?用過的值存儲在?小數據池中.供其他的變量量使?用. ?小數據池給數字和字符串串使?用, 其他數據類型不存在. 對於數字: -5~256是會被加到?小數據池中的. 每次使?用都是同?一個對象. 對於字符串串: 1. 如果是純?文字信息和下劃線. 那麽這個對象會被添加到?小數據池 2. 如果是帶有特殊字符的. 那麽不會被添加到?小數據池. 每次都是新的 3. 如果是單?一字?母*n的情況. ‘a‘*20, 在20個單位內是可以的. 超過20個單位就不會添加 到?小數據池中
註意(?一般情況下): 在py?文件中. 如果你只是單純的定義?一個字符串串. 那麽?一般情況下都是會 被添加到?小數據池中的. 我們可以這樣認為: 在使?用字符串串的時候, python會幫我們把字符串串 進?行行緩存, 在下次使?用的時候直接指向這個字符串串即可. 可以節省很多內存. 這個問題千萬不要糾結. 因為官?方沒有給出?一個完美的結論和定論.所以只能是?自?己摸索. 以下內容摘?自官?網中關於id()的描述
Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value. CPython implementation detail: CPython implementation detail: This is the address of the object in memory.
說了了這麽多. 這個id()和is有什什麽關系呢. 註意. is?比較的就是id()計算出來的結果. 由於id是幫我 們查看某數據(對象) 的內存地址. 那麽is?比較的就是數據(對象)的內存地址. 最終我們通過is可以查看兩個變量量使?用的是否是同?一個對象. == 雙等表?示的是判斷是否相等, 註意. 這個雙等?比較的是具體的值.?而不是內存地址 s1 = "哈哈" s2 = "哈哈" print(s1 == s2) # True print(s1 is s2) # True 原因是有?小數據池的存在 導致兩個變量量指向的是同?一個對象 l1 = [1, 2, 3] l2 = [1, 2, 3] print(l1 == l2) # True, 值是?一樣的 print(l1 is l2) # False, 值是假的
總結: is ?比較的是地址 == ?比較的是值
?二. 編碼的補充 1. python2中默認使?用的是ASCII碼. 所以不?支持中?文. 如果需要在Python2中更更改編碼. 需要在?文件的開始編寫:
# -*- encoding:utf-8 -*
2. python3中: 內存中使?用的是unicode碼. 編碼回顧: 1. ASCII : 最早的編碼. ?裏裏?面有英?文?大寫字?母, ?小寫字?母, 數字, ?一些特殊字符. 沒有中?文,
8個01代碼, 8個bit, 1個byte 2. GBK: 中?文國標碼, ?裏裏?面包含了了ASCII編碼和中?文常?用編碼. 16個bit, 2個byte 3. UNICODE: 萬國碼, ?裏裏?面包含了了全世界所有國家?文字的編碼. 32個bit, 4個byte, 包含了了 ASCII 4. UTF-8: 可變?長度的萬國碼. 是unicode的?一種實現. 最?小字符占8位 1.英?文: 8bit 1byte 2.歐洲?文字:16bit 2byte 3.中?文:24bit 3byte 綜上, 除了了ASCII碼以外, 其他信息不能直接轉換. 在python3的內存中. 在程序運?行行階段. 使?用的是unicode編碼. 因為unicode是萬國碼. 什什麽內 容都可以進?行行顯?示. 那麽在數據傳輸和存儲的時候由於unicode?比較浪費空間和資源. 需要把 unicode轉存成UTF-8或者GBK進?行行存儲. 怎麽轉換呢. 在python中可以把?文字信息進?行行編碼. 編碼之後的內容就可以進?行行傳輸了了. 編碼之後的數據是bytes類型的數據.其實啊. 還是原來的 數據只是經過編碼之後表現形式發?生了了改變?而已.
bytes的表現形式: 1. 英?文 b‘alex‘ 英?文的表現形式和字符串串沒什什麽兩樣 2. 中?文 b‘\xe4\xb8\xad‘ 這是?一個漢字的UTF-8的bytes表現形式
字符串串在傳輸時轉化成bytes=> encode(字符集)來完成 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個字節
python學習內容.06