Python中深相等与浅相等辨析:为何两元组is判断返回True?
问题解释
首先明确两个判断符的核心区别:
==:仅判断两个对象的值是否相等,和是否为同一内存实例无关is:判断两个对象是否为内存中的同一个实例(即地址完全相同)
你看到的资料描述不准确,Python对不可变类型的小对象存在缓存复用机制,具体表现:
- 字符串:短字符串会被缓存,相同内容的短字符串用
is判断会返回True;但长字符串或含特殊字符的字符串通常不会被缓存,此时is会返回False。 - 元组:当元组的元素都是不可变且被缓存的小对象(比如小整数、短字符串)时,Python会缓存这个元组实例。所以
t1 = (1, 2)和t2 = (1, 2)会指向同一个缓存对象,is判断自然返回True。但如果元组包含可变元素或未被缓存的大对象,缓存机制就不生效了:# 包含可变元素的元组,is判断返回False t3 = ([1], 2) t4 = ([1], 2) print(t3 is t4) # 输出False print(t3 == t4) # 输出True # 包含大整数的元组,is判断返回False t5 = (1000000, 2000000) t6 = (1000000, 2000000) print(t5 is t6) # 输出False - 列表:因为列表是可变类型,Python不会对其做任何缓存优化,每次创建新列表都会分配全新的内存地址,所以哪怕内容完全一致,
is判断也会返回False。
简言之:不是元组的is判断逻辑特殊,而是Python对满足条件的不可变元组做了缓存优化;列表作为可变类型,永远不会触发缓存,因此is判断结果和元组不同。
内容的提问来源于stack exchange,提问作者bib
相关产品推荐
相关产品推荐

