zoukankan      html  css  js  c++  java
  • python之is 和 == 的区别//编码和解码

    一.is  和  ==  的区别:

    1  .id()   内存地址

    2.  ==   比较    #比较两边的值

    3.   is    比较   #比较的是内存地址   

      数字,字符串,有小数据池

      #数字小数据池 :    -5~256

      特点:节省内存

    #.字符串中如果有特殊字符,那么不会添加到小数池中,他们的内存地址就不一样

    字符串中单个*20以内他们的内存一样,超过20个就不会添加到小数据池;单个*以上内存地址就不一样  

      str : 1,不能有空格

                  2,长度不能超过20个字符

        3,不能有特殊字符如:#$@...

    1.id ()  内存地址

    1 # id() 内存地址
    2 s = 'alex'
    3 print(s,type(s),id(s))
    4 # alex <class 'str'> 35619648
    5 # alex <class 'str'> 32146240

    2.==  比较的是值

    3. is  比较的是内存地址

     3.1 列表,字典,元祖,set集合

    1 # 列表、字典、元祖、set集合
    2 l1 = [1,2,3]
    3 l2 = [1,2,3]
    4 print(l1 == l2)  # True
    5 print(id(l1),id(l2))  # 35680008 35679368
    6 print(l1 is l2)  #False
    # 字符串、数字的特殊的。比较内存地址,pc看不出来,用cmd来查看s1 = 'alex  '
      3.2对于str 小数据池
    # 范围
    1.不能有空格。
    2.长度不能超过20位。
    3.不能有特殊字符。#@...
    # 有空格指向的是False
    >>> i = 'a'
    >>> i1= 'a'
    >>> print(i is i1)
    True
    
    >>> s1 = 'alex '
    >>> s2 = 'alex '
    >>> print(s1 == s2)
    True
    >>> print(s1 is s2)
    False
    
    >>> i = 'a  b'
    >>> i1= 'a  b'
    >>> print(i is i1)
    False
    # 超过20位则为False
    >>> i = 'a'*20
    >>> j = 'a'*20
    >>> print(i is j)
    True
    >>> i = 'a'*21
    >>> j = 'a'*21
    >>> print(i is j)
    False
    1 # 有特殊字符也为False
    2 >>> i = 'a@'
    3 >>> j = 'a@'
    4 >>> print(i is j)
    5 False

      

    3.3对于int 小数据池
    #范围:
      -5---256 创建的相同的数字,都指向同一个内存地址。
    
    
    >>> i = 6
    >>> i1= 6
    >>> print(i is i1)
    True
    >>> i = 258
    >>> i1= 258
    >>> print(i is i1)
    False
    >>> i = -5
    >>> i1= -5
    >>> print(i is i1)
    True
    
    
    
     


    # 我们发现,数字和字符串的数据地址是一样的. 列表和元组的数据地址是不一样的

    .

    二.编码和解码

    encoude(编码方式)    -----拿到明文编码后对应的字节t

    decode(编码方式)      -----将编码后的字节解码成对应的明文

    1.python2中使用的是ASCII码,所以不支持中文,如果需要在python中更改编码,需要在中文的开始编写:

      #-*- encoding:utf-8 -*-

    编码回顾;

    1.ASCII : 最早的编码,里面有英文大写字母,小写字母,数字,一些特殊字符,没有中文.

                  8 个bit(8位),1个 byte.

    2.GBK : 中文国标码,里面包含了ASCII编码,1

        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个字节。

  • 相关阅读:
    Spring MVC异常处理
    Spring MVC静态资源放行
    SpringMVC 接受前端传递的数据
    Eclipse+Maven构建SpringMVC+log4j2
    Eclipse+Maven构建SpringMVC项目
    log4j2
    Centos7 / RHEL 7 双网卡绑定
    CentOS7安装vncserver
    CentOS7修改ssh端口
    Linux配置Oracle 11g自动启动
  • 原文地址:https://www.cnblogs.com/wxj1129549016/p/9409725.html
Copyright © 2011-2022 走看看