zoukankan      html  css  js  c++  java
  • is和 == 的区别以及编码.解码

    一、is和==的区别

      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
        # 我们发现,数字和字符串的数据地址是一样的. 列表和元组的数据地址是不一样的.
    复制代码

      小数据池(常量池):把我们使用过的值存储在小数据池中,供其他数据使用。

           小数据池给数字和字符串使用,其他数据类型不存在。

           对于数字:-5~256是会被加到小数据池中的,每次使用都是同一个对象。

           对于字符串:

           1,如果是带特殊字符的,那么不会被添加到小数据池,每次都是新的;

           2,如果是单一字母*n的情况,如“a”*20,在20个单位内(包含20个)是可以的,超过20个单位就不会添加到小数据池;

           注意(一般情况下):在py文件中,如果你只是单纯的定义一个字符串,那么一般情况下都会被添到小数据池中,我们可以这样认为:在使用字符串的时候,python会帮我们把字符串进行缓存,在下次使用的时候直接指向这个字符串即可,可以节省很多内存。

      这个问题千万不要纠结,因为官方没有给出一个完美的结论和定论,所以只能是自己摸索

           说了这么多,这个id( )和is有什么关系呢?注意,is比较的就是id( )计算出来的结果,由于id( )是帮我们查看某数据(对象)的内存地址,那么is比较的就是数据(对象)的内存地址,即我们通过is可以查看两边使用的是否是同一个对象。

           双等(==)表示的是判断是否相等,注意,这个双等比较的是具体的值。

           总结:==比较的是两边的值是否一样;is比较的是内存地址是否一样,即是不是同一个对象。

    二、编码的问题

           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'xe4xb8xad',这是一个汉字的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'xe4xb8xad'
        s2 = s.encode("GBK") # 中文编码成GBK,结果为:b'xd6xd0'
    
        # 解码:
        print(s1.decode("UTF-8"))  #结果为:中
        print(s2.decode("GBK"))   #结果为:中
    复制代码

      注意:用什么进行编码就要用什么进行解码。

      记住:英文编码之后的结果是原字符串一致,中文编码之后的结果根据编码的不同,编码结果也不同,我们能肯定,一个中文UTF-8是3个字节。一个GBK的中文编码是2个字节。

  • 相关阅读:
    cocos2dx 2.14使用UUID
    cocos2dx游戏项目总结(持续更新)
    window mac iPhone 三种比较相似的字体
    【luogu P4762】字符串合成 / Virus synthesis(PAM)(DP)
    【luogu P7796】图书管理员 / POLICE(并查集)(树状数组)
    【luogu P5494】【模板】线段树分裂(线段树合并)(线段树分裂)
    【luogu P2595】多米诺骨牌(插头DP)(容斥)
    送分大水题(高维前缀和)(高维差分)
    【luogu P6880】Bus / 奥运公交 / オリンピックバス(最短路)
    【luogu P1879】Corn Fields G / 玉米田++ / 玉米田(加加强版)(状压DP)(轮廓线DP)
  • 原文地址:https://www.cnblogs.com/xihuanniya/p/9408232.html
Copyright © 2011-2022 走看看