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

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

转载于:https://www.cnblogs.com/xiayuhao/p/9449314.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值