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

  • 相关阅读:
    Path Sum II
    Convert Sorted Array to Binary Search Tree
    Construct Binary Tree from Inorder and Postorder Traversal
    Construct Binary Tree from Preorder and Inorder Traversal
    Maximum Depth of Binary Tree
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Same Tree
    Validate Binary Search Tree
    Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/wxj1129549016/p/9409725.html
Copyright © 2011-2022 走看看