Python 中 is 和 == 的区别
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
Python中的is
和==
操作符都用于比较对象,但is
要求对象的值和内存地址都相同,而==
只需要对象的值相等。例如,使用time()
方法获取的不同时间点对象值相同但内存地址不同,导致t1 == t2
为True但t1 is t2
为False。
Python中的小整数池涵盖了[-5, 256]的整数范围,这些数值在内存中有预分配的空间,因此多次定义的小整数对象内存地址相同。对于小整数池之外的数,它们在IDE环境或脚本模式下由于Python的缓存机制,多个变量引用同一数值不会重新开辟内存空间,但在交互模式下则不是这样。
Python的缓存机制预存储了高频使用的不可变数据类型(数字、字符串、元组)以减少内存申请和销毁的开销,因此在同一代码块中,这些数据类型的对象被多个变量引用时,不会重复开辟内存空间。然而,可变数据类型(列表、字典、集合)不遵循这一规则。
不可变数据类型中的小整数池数在交互模式下使用固定缓存。而非小整数池内的数,在IDE环境下多个变量引用同一数据时不会开辟新的内存空间,但在交互模式下,除非同时赋值或同一个局域代码块内赋值,否则会使用缓存机制。
Python中的字符串类型还采用了intern机制,即相同的字符串对象在字符串储蓄池中只保存一份,不会为新的变量开辟新的内存空间。在交互模式下,只包含字母、数字、下划线的字符串会触发intern机制,而在IDE环境或脚本模式下,长度限制(在Python 3.9中观察到没有长度限制)之内的字符串,即使包含特殊字符也会触发intern机制。
想要了解更多内容?