【Python打卡日:20220512】小整数对象池和大整数对象池

一、识别 is 、is  not 关键字

判断两个对象是否是同一个对象,即两个对象在内存中的地址是否相同

    1)是,返回True

    2)不是,返回False

【1.1】小整数对象池

若是整数且在小整数池内,多个变量绑定同一数值时,实际上是这几个变量绑定(引用)同一个对象。小整数对象池[-5,256],左闭右闭区间。为避免频繁的创建和销毁内存空间,提高效率、优化运算速度,python内建小整数对象池,这个范围内的整数在python初始化的时候就创建了,在内存中存在。del语句删除的时候,不会被销毁、释放,可以一直重复使用。这些整数一直存在,所以这个范围内的相同整数是同一个对象,它们的id相同,可用id()函数验证整数和字符串是不可变对象,也就意味着可以用来共享,如100个“python”字串变量可以共享一个“python”字符串对象,而不是创建100个“python”字符串。

In [20]: a = 100

In [21]: b = 100

In [22]: c = 500

In [23]: d = 500

In [24]: a is b
Out[24]: True

In [25]: c is d
Out[25]: False

当变量绑定的数值在小整数池中时,不会创建新的对象,而是直接引用小整数对象池中的数据。

【1.2】大整数对象池

当数值不在小整数对象池内时,会自动创建新的对象。但是,处于同一个代码块的相同数值,是同一个对象。一个代码块就是一个【.py】文件。

2 a = 100
3 b = 100
4 c = 500
5 d = 500
6 print(a is b) # True
7 print(c is d) # True
8 print(a is c) # False

【1.3】字符串的判断

判断两个字符串是否是同一个对象时,要注意字符串的intern机制。

*intern机制*

即值同样的字符串对象仅仅会保存一份,放在一个字符串池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

举例:

>>> a= "111111111111111111111111111111111111"  #只包含整数的字符串
>>> b= "111111111111111111111111111111111111"
>>> a == b
True
>>> a is b
True


>>> a = -5  # [-5,256]的整数
>>> b = -5
>>> a is b
True


>>> a=-88  #[-5,256]以外的整数
>>> b = -88
>>> a is b
False

>>> a = "aaaaaaaaaaaa aaa"  # 不是只包含字母、数字、下划线的字符串
>>> b = "aaaaaaaaaaaa aaa"
>>> a is b
False

二、结论

1、is, is not   对比的是两个变量的内存地址

2、==,!=    对比的是两个变量的值

由此可以进一步推出:

a、假如比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的

b、假如对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值