zoukankan      html  css  js  c++  java
  • python -- 小数据池 is和 == 再谈编码

    1、小数据池
    python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元。
    代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块,eval()和exec()执行的时候也是代码块。
    什么是命令行?
    我们再控制台CMD中输入python进入的就是python的command模式。
     
    一个command命令就是一个代码块
    小数据池:一种数据缓存机制,也被称为驻留机制,也相当于常量池。(string  iterning)
    小数据池只正对:整数(int),字符串(str),布尔型(bool)(都是不可变的数据类型)
    在py文件中,几乎所有的字符都会缓存。
    id() 查看变量的内存地址
    a = 123
    print(id(a))
    # 1416592208

       

    在python中 对-5到256之间的整数会被驻留在内存中,讲一定规则的字符串缓存,在使用的时候,内存中只会创建一个该数据的对象,保存到小数池中,在使用的时候,直接从小数池中获取对象的内存引用,而不需要创建一个新的数据,这样会节省更多的内存区域。
     
    优点:能够提高一些字符串,证书的处理速度,省略创建对象的过程。
    缺点:在小数据池中创建或者插入新的内容,会花费较多的时间。
     
    对于数字:-1~256是会被加到小数池中,每一次使用都是同一对象。
     
    对于字符串:
     
        1、如果字符串的长度是0 或者1,都会默认进行缓存。
        2、字符长度大于1,但是字符串中只包含数字,字母,下划线时才会缓存
        3、用到乘法的字符串,①乘数为1,仅包含数字,字母,下划线时才会被缓存。如果包含其他字符,而长度小于等于1 也会被驻存  ②乘数大于1,仅包含数字,字母,下划线时会被缓存,但字符串长度不能大于20.
        4、指定驻留,我们可以通过sys模块总的intern()函数来指定要驻留的内容。
     
     
    2、is 和 ==
     
        == 判断左右两端的值是否相等,是不是一致,(比较内容)
        is  判断左右两端的内存地址是否相等,如果返回 True,那可以确定这两个变量使用的是同一个对象。(比较内存地址)
     
    当两个变量指向同一对象时,is 是 True  ==也是True

    如果在py 文件中写的字符串,几乎都是缓存的,在cmd中写的几乎都不会缓存。 

    a = 257
    b = 257
    print(id(a))      # 1707735307344
    print(id(b))     # 1707735307344
    print(a is b)    # True

      两个对象 内存地址是不一样的

    lst1 = [1,2,3] # 两个对象 内存地址是不一样的
    lst2 = [1,2,3]
    print(id(lst1)) # 2748225600840
    print(id(lst2)) # 2748225627144

      

    在创建字符串之前,会先去小数池比对,是否已经存在了该字符串,如果存在了,就不再创建新的了,直接拿原来存在的数据,省略掉反复重复创建字符串的过程,节约内存。
     
     
    3、编码的补充
     
       1、回顾编码
     
               ASCII:最早的编码,里边有英文大写字母,英文小写字母,数字,一些特殊字符,没有中文, 8bit,一个byte
               GBK:包含ASCII,中文(主要),日文,韩文,繁体文字。16bit ,2byte
               unicode:万国码,包含ASCII,gbk,big5. ...32bit,  4byte
               UTF-8:可变长度的unicode
                    1、英文: 8bit ,1 byte
                    2、欧洲文字:16bit , 2byte
                    3、中文: 24bit , 3byte
    不同的编码间不能随意转化,需要通过媒介(unicode)转化。
    在python3中,默认的编码是unicode,我们的字符串就是unicode
    在python2 中,默认的编码是ASCII,Cpython,c语言的默认编码是ASCII
     
    unicode的弊端:在存储和传数数据的时候不能直接使用unicode,必须要对字符串进行编码,编码成ASCII类型。
    bytes:字节形式的字符串,不是给人看的,是给机器用的。非ASCII中的内容,展示的时候都是 x..如果是ASCII中的内容,原样输出。
     
    1、encode(编码格式) 编码
    2、decode(编码格式) 解码
     
    UTF-8 和GBK是不能直接转化的,必须使用unicode来转化。
    m = '今天晚上想看什么书!'
    a = m.encode('gbk')
    print(a)
    b = m.encode('utf-8')
    print(b)
     
    # b'xbdxf1xccxecxcdxedxc9xcfxcfxebxbfxb4xcaxb2xc3xb4xcaxe9xa3xa1'
    # b'xe4xbbx8axe5xa4xa9xe6x99x9axe4xb8x8axe6x83xb3xe7x9cx8bxe4xbbx80xe4xb9x88xe4xb9xa6xefxbcx81'
     
  • 相关阅读:
    HDU1325 Is It A Tree? (并查集判断有向图是否是树)
    DRF 视图家族及路由层补充
    DRF 外键字段深度查询优化、ListSerializer辅助完成群改
    DRF的orm多表关系补充及serializer子序列化
    DRF序列化
    DRF的封装:APIView类及五大模块
    DRF简介/接口概念
    vue-axios插件、django-cors插件、及vue如何使用第三方前端样式库:element/jQuery/bootstrap
    Vue项目的创建、路由、及生命周期钩子
    Vue框架-组件的概念及使用
  • 原文地址:https://www.cnblogs.com/1915823-huxt/p/10060738.html
Copyright © 2011-2022 走看看