聊聊Python中的is和==
Posted 陈驰字新宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊聊Python中的is和==相关的知识,希望对你有一定的参考价值。
首先,Python中的is就是判断地址是否相等(相当于Java中的==),Python中的==就是判断数值是否相等(相当于Java中的equals)。
看个简单的例子:
a = [1, 2, 3] b = [1, 2, 3] id(a) Out[16]: 2531065911112 id(b) Out[17]: 2531064874824 a == b Out[18]: True a is b Out[19]: False
因为地址不同,但是元素是相同的。
但是会发现一些好玩的东西,比如:
a = 100 b = 100 id(a) Out[22]: 140720205396832 id(b) Out[23]: 140720205396832 a == b Out[24]: True a is b Out[25]: True
a = 10000 b = 10000 id(a) Out[29]: 2531066740880 id(b) Out[30]: 2531066741104 a == b Out[31]: True
我们发现上面两个结果竟然不同,怎么回事呢?
原来是因为Python中整型的复用机制:
在python的整型对象中,将-5~256(python源码中定义)这些整数对象放于小整数对象池中缓存。
python中除上述的小整数外其他称为大整数,创建时为其分配空间。
但创建两个相同的大整数时,会为其分配不同的地址空间。
同理针对字符串:
a = ‘chenchi‘ b = ‘chenchi‘ id(a) Out[35]: 2531066870728 id(b) Out[36]: 2531066870728 a == b Out[37]: True a is b Out[38]: True
在创建字符串时,python会根据字符串长度判断是否创建字符串对象。在WIN32平台上,最大为2147483647,即2GB,大于该值不会创建字符串对象。
python字符串对象中,存在intern机制,即共享机制。对于空字符串,python只会在第一次使用时创建,后面使用时只会返回原来创建的对象(类似单例模式)。
对于应用了intern机制的字符串对象,会直接返回对象的引用。实际使用中,创建两个相同的字符串变量时,地址是相同的。
参考
https://blog.csdn.net/qq_33512078/article/details/78357773
以上是关于聊聊Python中的is和==的主要内容,如果未能解决你的问题,请参考以下文章
[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段
java中的集中关系,is a, has a, 继承,重点聊聊继承
add application window with unknown token XXX Unable to add window;is your activity is running?(代码片段