zoukankan      html  css  js  c++  java
  • Python学习-is和==区别, encode和decode

    一、is 和 == 介绍

    1. is  比较的是两个对象的内存地址是否相同,它们是不是同一个对象。

    2. ==  比较的是两个对象的内容是否相同。

    在使用is前,先介绍Python的一个内置函数id(),它是用于查看对象在内存中的id.

    >>> a = 10
    >>> b = 'hello'
    >>> c= (1, 3, 5)
    >>> id(a); id(b); id(c)
    4365573024
    4372638160
    4372561496

    代码实例:

    # 数字
    >>> a = 5
    >>> b = 5
    >>> print(a==b)
    True
    >>> a is b
    True
    
    #字符串
    >>> n1 = 'jason'
    >>> n2 = 'jason'
    >>> print(n1==n2)
    True
    >>> n1 is n2
    True
    
    #列表
    >>> ls1 = [1, 3, 5, 7]
    >>> ls2 = [1, 3, 5, 7]
    >>> print(ls1==ls2)
    True
    >>> ls1 is ls2
    False
    
    #元组
    >>> tu1 = (1, 2, 3)
    >>> tu2 = (1, 2, 3)
    >>> print(tu1 == tu2)
    True
    >>> tu1 is tu2
    False
    
    #字典
    >>> info1 = {'name': 'jason', 'age': 25}
    >>> info2 = {'name': 'jason', 'age': 25}
    >>> print(info1 == info2)
    True
    >>> info1 is info2
    False
    >>> id(info1)
    4372560920
    >>> id(info2)
    4367493088

    #集合

      >>> seta = set(['a', 'b', 'c'])
      >>> setb = set(['a', 'b', 'c'])
      >>> print(seta == setb)
      True
      >>> seta is setb
      False

    总结:

    当对象为数字、字符串时,对象1 is 对象2为True;当对象为列表、元组、字典、集合时,对象1 is 对象2为False。 

    再看下面的一组列子:

    >>> a = -4  # 对象也为数字,为什么为False了
    >>> b = -4
    >>> a is b
    True
    >>> a = -6
    >>> b = -6
    >>> a is b
    False
    >>> a = -5
    >>> b = -5
    >>> a is b
    True
    >>> a = 257
    >>> b = 257
    >>> a is b
    False
    
    >>> a = 'hello'
    >>> b = 'hello'
    >>> a is b
    True
    >>> new_a = a * 20
    >>> new_b = b * 20
    >>> new_a is new_b
    False

    注意,Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。

    二、encode和decode

    注意:

    1) python2中默认使用的是ASCII码,所以默认不支持中文.

    2) python3中默认使用的是unicode码

    在Python的内存中, 在程序的运行阶段, 使用的是unicode编码. 因为unicode是万国码, 什么内容都可以显示, 但是在数据传输和存储的时候, 由于unicode比较浪费空间和资源, 需要把unicode转成UTF-8或GBK进行存储. 怎么转换呢, 在python中可以对文字信息进行编码, 编码之后的内容就可以进行传输了. 编码之后的数据是bytes类型的数据. 其实, 还是原来的数据, 只是经过编码之后, 表现形式发生了改变而已.

    字符串在传输的时候转换成bytes, 由encode来完成.

    代码示例:

    name = 'jason'
    name1 = name.encode('utf-8')
    print(name1)
    name2 = name.encode('GBK')
    print(name2)
    
    s = ''
    s1 = s.encode('utf-8') #utf-8编码,中文占3个字节
    print(s1)
    s2 = s.encode('GBK')  #GBK编码, 中文占2个字节
    print(s2)

    #执行结果:

      b'jason'
      b'jason'
      b'xe5xa5xbd'
      b'xbaxc3'

    英文编码之后的结果和源字符串一致. 中文编码之后的结果, 根据编码的不同, 得到的编码结果也不同. 从上方代码示例可以看出, 一个中文的utf-8编码是三个字节. 一个GBK的中文编码是两个字节.编码之后的类型就是bytes类型. 在网络传输和存储的时候, python保存和存储的就是bytes类型. 那么对方接收的时候, 也是接收的bytes类型的数据, 可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串.

    greeting = '你好世界'
    s = greeting.encode('utf-8')
    print(s)
    s1 = b'xe4xbdxa0xe5xa5xbdxe4xb8x96xe7x95x8c'
    print(s1.decode('utf-8'))
    
    #运行结果
    b'xe4xbdxa0xe5xa5xbdxe4xb8x96xe7x95x8c'
    你好世界
    
    # x分隔的, 每个x和其后字符, 表示的是一个字节

    编码和解码的时候都需要指定编码格式:

    s = '你好'
    s2 = s.encode('GBK')
    print('s2:', s2)
    # 把GBK转为utf-8, 首先要把GBK转为unicode,也就是需要解码
    s3 = s2.decode('GBK')
    # 重新编码成utf-8
    s4 = s3.encode('utf-8')
    print('s4:', s4)
    
    # 运行结果
    s2: b'xc4xe3xbaxc3'
    s4: b'xe4xbdxa0xe5xa5xbd'

    以上就是关于编码解码的简单解释.

  • 相关阅读:
    邻接表怎么写
    hiho一下 第二十五周(SPFA)
    hdu 1426 Sudoku Killer(DFS)
    hdu5147 (sequence 2) 树状数组
    hdu1233 prim
    输入输出外挂
    RMQ-ST求区间最值
    最近公共祖先(简单版)
    【Java】【20】后台发送GET/POST方法
    【实战问题】【11】导入Maven项目后报错,Project configuration is not up-to-date with pom.xml. Run project configuration update
  • 原文地址:https://www.cnblogs.com/gandoufu/p/9286360.html
Copyright © 2011-2022 走看看