• 06_python_小数据池/ is == /编码


    一、小数据池

      1、代码块
      python程序是由代码块构成的。一个代码块的文本作为python程序执行的单元。代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块, eval()和exec()执行的时候也是一个代码块。
     
      2、小数据池:一种数据缓存机制,也被成为驻留机制,它只针对整数、字符串、布尔值(不可变)其他数据类型不存在驻留机制。
      在python中对-5 ~256之间的整数会被驻留在内存中,将一定规则的字符串缓存,在使用的时候,内存中只会创建一个该数据的对象,保存在小数据池中,当使用的时候直接从小数据池中获取对象的内存引用,而不需要创建一个新的数据,节省内存区域。
      优点:能够提高一些字符串、整数的处理速度,省略创建对象的过程
      缺点:在池中创建或者插入新内容会花费更多时间
     
      3、针对数字、字符串
        (1)数字:-5~256是会被加到小数据池中的,每次使用都是同一对象
        (2)字符串:
        <1>如果字符串的长度是0 或 1,都会默认进行缓存
        <2>字符串长度大于1,但字符串中只含字母、数字、下划线时才会缓存
        <3>用乘法得到的字符串,乘数为1,只含字母、数字、下划线时才会缓存,如果包含其他字符,而长度<=1也会被驻存。乘数大于 1,只含字母、数字、下划                                      线时才会缓存,但字符串长度<=20
        <4>指定驻留,通过导入os模块
    1 from sys import intern()
    2 a = intert('#$%^*fjewio')
    3 b = intert('#$%^*fjewio')

      在代码块内的缓存机制是不一样的. 在执行同一个代码块的初始化对象的命令时, 会检查是否其值是否已经存在, 如果存在, 会将其重用. 换句话说: 执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中, 在遇到新的变量时, 会先在字典中查询记录, 如果有同样的记录那么它会重复使用这个字典中的之前的这个值. 所以在你给出的例子中, 文件执行时(同一个代码块) 会把a, b两个变量指向同一个对象.如果是不同的代码块, 他就会看这个两个变量是否是满足小数据池的数据, 如果是满足小数据池的数据则会指向同一个地址. 所以: a, b的赋值语句分别被当作两个代码块执行, 但是他们不满足小数据池的数据所以会得到两个不同的对象, 因此is判断返回False.  

    二、is 和 ==的区别

      1、id() #通过id()可以查看一个变量表示的值在内存中的地址。
      2、is :判断左右两端内容的内存地址是否一致,如果返回True则两变量使用的是同一对象
      3、== :判断左右两端的值是否相等,内容是不是一样的
      内存地址相同,那么值一定是相等的,如果值相等,则不一定是同一个对象。

    三、编码、解码

      1、回顾
      ASCII码 只有大小写字母、数字、一些特殊字符,没有中文,8 bit(1B)
      GBK:中文编码里面包含ASCII,16bit(2B)
      Unicode:万国码,32bit(4B)
      UTF-8:可变长万国码,是Unicode的一种实现,最小字符占8位,英文8bit(1B)、欧洲 16bit(2B)、中文24bit(3字节)
      除了ascii码以外,其他信息不能直接转换。
     
      2、Unicode和utf-8
      在python3的内存中,在程序运行阶段,使用的是Unicode编码,因为Unicode是万国码,什么内容都可以进行显示,那么在数据传输和储存的时候由于Unicode比较浪费空间和资源,需要把Unicode转存成utf-8或者GBK进行存储,在python中科院把文字信息进行编码,编码之后的内容就可以进行传输了,编码之后的数据是bytes类型数据
      bytes的表现形式:1.英文 b'alex' 2.中文 b'xe4xb8xad'
     
      3、编码解码
      字符串在传输时转换成bytes =>encode(字符集)来完成
     1 s = 'alex'
     2 print(s.encode('utf-8')) # 将字符串编码成UTF-8
     3 print(s.encode('GBK')) #将字符串编码成GBK
     4 结果:
     5 b'alex'
     6 b'alex'
     7 
     8 s = ''
     9 print(s.encode('utf-8')) # 将字符串编码成UTF-8
    10 print(s.encode('GBK')) #将字符串编码成GBK
    11 结果:
    12 b'xe4xb8xad'
    13 b'xd6xd0'

      注意:英文编码之后的结果和源字符串一致,中文编码之后的结果根据编码的不同,编码结果也不同,我们能看到,一个中文的UTF-8是3字节,一个GBK的中文编码是2字节。编码之后的数据类型是bytes,在网络传输和存储的时候我们python是保存和存储的bytes类型,那么在对方接收的时候,也是接收的是bytes类型的数据,我们可以使用decode()来进行解码操作,把bytes类型的数据还原回字符串

    1 s = "我叫李嘉诚"
    2 print(s.encode("utf-8")) #
    3 b'xe6x88x91xe5x8fxabxe6x9dx8exe5x98x89xe8xafx9a'
    4 print(b'xe6x88x91xe5x8fxabxe6x9dx8exe5x98x89xe8xafx9a'.decode("utf-8")) # 解码

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

    1 s = "我是文字"
    2 bs = s.encode("GBK") # 我们这样可以获取到GBK的文字
    3 # 把GBK转换成UTF-8
    4 # 首先要把GBK转换成unicode. 也就是需要解码
    5 s = bs.decode("GBK") # 解码
    6 # 然后需要进行重新编码成UTF-8
    7 bss = s.encode("UTF-8") # 重新编码
    8 print(bss)

     

  • 相关阅读:
    JavaScript系列:《JavaScript高级程序设计》,chapter2, 在html中使用JavaScript
    Java系列:JVM指令详解(下)(zz)
    Java系列:JVM指令详解(上)(zz)
    Java系列:关于Java中的桥接方法
    REST: C#调用REST API (zz)
    Activiti系列:为什么Activiti 5.18 的REST的api总是返回404错误
    timeSeries db之:使用Metrics监控应用程序的性能 (zz)
    Java系列:国际化(zz)
    通过数据库方式访问excel 2007及其以后(xlsx)文件的连接字符串
    java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧
  • 原文地址:https://www.cnblogs.com/hq82/p/9621963.html
Copyright © 2020-2023  润新知