is和 == 的區別以及編碼.解碼

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個字節。

相關文章
相關標籤/搜索