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()地址就不同了

  • 相关阅读:
    无缘无故出现IDEA无法引入包和类的问题?
    JDK8新特性——Optional
    【工具类】ExcelUtils
    【Mybatis-Plus学习笔记(二)】查询
    【Mybatis-Plus学习笔记(一)】入门
    【Mybatis学习笔记】目录
    【超详细全过程】DataGrip的安装与使用
    【超详细全过程】python环境配置+编辑器安装(python+pycharm)
    【Mybatis工具(五)】雪花算法
    【Mybatis工具(四)】UUID实现原理及其Java实现
  • 原文地址:https://www.cnblogs.com/xiayuhao/p/9449314.html
Copyright © 2011-2022 走看看