Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制主要有两个:小数据池和代码块。驻留机制并不是学习 Python 过程中特别重要的概念,我们学习小数据池的目的主要有两个方面:

  1. 解决日后写代码过程中可能出现的疑惑。在后期开发中,能 明确 知道有些代码为什么不能正常使用
  2. 找工作面试时或多或少可能被问到,关键时刻起到装 X 的作用

先补充一个关键字 isis(是)==(等于) 的作用十分相似,我们在这里将它们进行一个对比:

== :
    官方:判断等号两边的内容是否相同
    白话:判断两个人的长相是不是一样
is :
    官方:判断两边的内容是不是同一个
    白话:判断这两个人是不是同一个人

is 是通过 内存地址 进行判断,如果 内存地址 相同,返回 True;内存地址不同,返回 False

有了上面的补充,我们来看下面的这个例子:

a = 1000
b = 1000
print(a == b)
print(id(a), id(b))
print(a is b)   # 判断a是不是b

在PyCharm中的运行结果是:
True
2565251570544 2565251570544
True
在终端中的运行结果是:
True
1407133449136 1407133448880
False

在 PyCharm 中运行时我们发现,虽然 a 和 b 分别赋值 1000,它们在内存中的地址居然是相同的。而在终端中运行同样的代码,却又得到了 a 与 b 不相同的结果。

这是 Python 中的驻留机制造成的影响。Python 中,为了节省内存,会将一些小的数据驻留,当再次有变量获得相同的赋值时,不会开辟新的内存空间,而是指向原有的值所处的内存空间。

在 PyCharm 中运行的是一个 py 文件,是一个代码块。在代码块中,只要是大于 -5 的数字都共用同一个内存地址。而在终端中每一行分别为一个代码块,两个赋值操作共用一个小数据池。在小数据池中,只有在 -5 ~ 256 范围的数字才会被驻留。

小数据池和代码块的缓存机制是这样的:

终端中测试的是小数据池的缓存机制:
    数字:-5 ~ 256
    字符串:
    定义时内容不能为中文和特殊符号,长度不限,只要内容相同,就会进行驻留
    Python 3.6解释器字符串进行乘法时,也不能有中文字符和特殊符号,总长度不能超过20
    Python 3.7解释器字符串进行乘法时,不能有中文字符和特殊符号,总长度不能超过4096

PyCharm中测试的是代码块的缓存机制:
    数字:-5 ~ 正无穷
    字符串:
    定义内容、长度均不限,只要内容相同,就会驻留
    字符串进行乘法时,不能有中文字符和特殊符号,总长度不能超过20

对于字符串总长度的驻留情况,可以这样检验:

a = 'alex' * 6
b = 'alex' * 6
print(a is b)

原文地址:https://www.cnblogs.com/shuoliuchina/p/12430809.html

时间: 2024-10-30 04:13:20

Python 中的驻留机制:小数据池和代码块的相关文章

Python 小数据池、代码块以及代码块缓存机制

按照惯例,吟诗一首:苏轼<江城子·乙卯正月二十日夜记梦> 十年生死两茫茫,不思量,自难忘.千里孤坟,无处话凄凉. 纵使相逢应不识,尘满面,鬓如霜. 夜来幽梦忽还乡,小轩窗,正梳妆.相顾无言,惟有泪千行. 料得年年肠断处,明月夜,短松冈. 1. is 和 == 之间的区别 在讲解代码块及其缓存机制之前有必要搞清楚is和==之间的区别 开门见山直接说:==是比较两边变量的值是否相同,is是比较两边变量的内存地址是否相同,在python中内存地址如何获取,当然是使用id(item)函数获取了 举两个

python基础之小数据池、代码块、编码

一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽然上面的缩进的内容都叫代码块,但是他不是python中严格定义的代码块.python中真正意义的代码块是什么? 块是一个python程序的文本,他是作为一个单元执行的.代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而对于一个文件中的两个函数,也分别是两个不同的代码块: def fu

python小数据池、代码块

一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是一个代码块. 什么叫交互方式?就是咱们在cmd中进入Python解释器里面,每一行代码都是一个代码块. 不同的代码块: def func(): print(333) class A: name = 'alex' 虽然上面的缩进的内容都叫代码块,但是他不是python中严格定义的代码块. for i

python 小数据池、代码块详解

首先我们来看看下面的问题,第一次遇到还以为见鬼了.                    看到上面这么多种情况刚开始直接就懵逼了.100ID一样,1000就不一样.终端运行情况居然会和pycharm不一样. 后面终于搞懂了,原来这里头有大学问,且看下面分析. 一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是一个代码块. 也就是说:       所

Python小数据池,代码块解析

一.id,is,== 在Python中,id是什么?id是内存地址,比如你利用id()内置函数查询一个数据的内存地址: name = '太白' print(id(name)) # 1585831283968 那么is又是什么?==又是什么? == 是比较两边的数值是否相等,而is是比较两边的内存地址是否相等.如果内存地址相等,那么这两边其实是指向同一个内存地址. 可以说如果内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同. 二.代码块 根据官网提示我们可以获知: 根据提示我们从官

五.python小数据池,代码块的最详细、深入剖析

一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的,就好比是身份证号,标识这个空间的叫做内存地址,也就是这个数据(对象)的id,那么你可以利用id()去获取这个数据的内存地址: name = '太白' print(id(name)) # 1585831283968 那么 is 是什么? == 又是什么? == 是比较的两边的数值是否

python小数据池,代码块的最详细、深入剖析

一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的,就好比是身份证号,标识这个空间的叫做内存地址,也就是这个数据(对象)的id,那么你可以利用id()去获取这个数据的内存地址: name = '太白' print(id(name)) # 1585831283968 那么 is 是什么? == 又是什么? == 是比较的两边的数值是否

python小数据池,代码块深入剖析

小数据池 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建更多的对象 缓存:int,str,bool int:缓存范围-5~256 str:    1.长度小于等于1,直接缓存 2.长度大于1.字符串中如果只有数字,字母,下划线,就会缓存 3.乘于1.同上,乘于大于1的数.仅包含数字,字母,下划线,最终长度小于20会缓存 4.使用sys模块中的intern()缓存字符串 代码块的关系:如果在同一个代码块中,默认的整数和字符串还有布尔值都会进行缓存,如果涉及计算,尊崇上面的规则, 如果跨

8.小数据池,代码块

15.小数据池 小数据池就是python 中一种提高效率的方式,固定数据类型使用同一个内存地址 小数据池----支持:str,int,bool 前提:不同代码块的缓存机制 缓存机制的优点:提升性能,节省内存. 小数据池怎么用? a=1 b=1 #id 查看空间的内存地址 获取开辟空间的一种地址 print(id(a)) print(id(b)) 小数据池数字范围:-5~256 字符串: 1.字符串在做乘法的时候总长度不能超过20,进行驻留 # 记住 2.自己定义的字符串 长度不限制 字符串必须(