zoukankan      html  css  js  c++  java
  • 代码块与小数据池之间的关系

    关于python代码块以及贮留机制

    什么是代码块

    python程序是由代码块构造的,代码块是一个python程序的文本,作为一个单元执行
    一个模块(如time模块,就是一个.py文件),一个类,一个文件等都是一个代码块。
    在交互式中输入的每一行命令都是一个代码块(cmd进入python解释器,每一行就是一个代码块)。对于一个文件中的两个函数,分别是不同的两个代码块。

    id,is,==

    在python中,id代表内存地址,
    例如name = "summer"
    id(name) 4324720512

    这后面的一串数字,就是"summer"的内存地址,那么,如果内存地址相同的两个数,值肯定相同,== 表示的是数值之间的比较,is 是id之间的比较

    小数据池

    小数据池也称为小整数缓存机制,或者成为驻留机制

    python中小数据池只针对整数、字符串、bool值

    优点:提升效率,节省内存

    int:在整数中,小数据池的范围是-5~256,如果多个变量只想范围内的同一个数字,那么它们在内存中都是指向同一个内存地址

    str:

    1、字符串的长度为0或者为1,默认采用小数据池

    2、当字符串的长度大于1且小于20,并且只含有大小写字母、数字、下划线是,默认采用小数据池;

    3、指定驻留

    from sys import intern
    a = intern('hello!@'20)
    b = intern('hello!@'
    20)
    print(a is b)
    指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。

    代码块与小数据池之间的关系

    同样一段代码,为什么在交互方式中执行,和通过python代码的文件执行结果不同呢?

    # pycharm 通过运行文件的方式执行下列代码:
    i1 = 1000
    i2 = 1000
    print(i1 is i2)  # 结果为True
    
    通过交互方式中执行下面代码:
    >>> i1 = 1000
    >>> i2 = 1000
    >>> print(i1 is i2)
    False
    

    上述结果的不同是因为代码块的缓存机制

    Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象。

    如果是不同的代码块,他就会看这个两个变量是否是满足小数据池的数据,如果是满足小数据池的数据则会指向同一个地址。所以:i1、i2赋值语句分别被当作两个代码块执行,但是他们不满足小数据池的数据所以会得到两个不同的对象,因而is判断返回False。

    对于同一个代码块的变量复用的问题,只能针对于数字,字符串,bool值,而对于其他数据类型是不成立的。

    注意

    数字-5到256都在小数据池中,所有的正数都在同一个代码块中,id()地址相同,但是负数小于-5后,是重新开辟的内存空间,id()地址就不同了

  • 相关阅读:
    mxnet笔记
    8.1.18示例:使用forName()的扩展
    8.1.17使用1.2版本的用户自定义类装载器
    8.1.16 使用1.1版本的用户自定义类装载器
    8.1.13 _quick 指令
    8.1.12直接引用
    8.1.11编译时常量解析
    8.1.10装载约束
    8.1.8 解析CONSTANT_String_info入口
    8.1.7 解析CONSTANT_interfaceMethodref_info入口
  • 原文地址:https://www.cnblogs.com/xiayuhao/p/9449314.html
Copyright © 2011-2022 走看看