Python中in关键字判断成员关系是校验标识还是相等性?
结论
in 关键字在列表、字典等容器中做元素存在性校验时,判断依据是相等性(即==运算符的逻辑),而非对象标识(is运算符的逻辑)。
验证方法(避开字符串驻留干扰)
你之前用字符串测试无法区分两种逻辑的差异,是因为CPython解释器默认会对字面量形式的短字符串做驻留(intern)处理:相同内容的字符串会复用同一个内存对象,导致is和==的返回结果一致,无法观测到区别。
使用自定义类的实例测试即可清晰验证逻辑:
class MyObj: def __init__(self, val): self.val = val def __eq__(self, other): # 自定义相等性逻辑:只要val属性相等就判定为相等 if isinstance(other, MyObj): return self.val == other.val return False # 实例化两个对象,内容相同但内存地址不同 obj_a = MyObj(5) obj_b = MyObj(5) print(obj_a is obj_b) # 输出 False,两个是不同的内存对象 print(obj_a == obj_b) # 输出 True,符合自定义的相等逻辑 # 列表存在性测试 test_list = [obj_a] print(obj_b in test_list) # 输出 True,证明in用的是相等性判断
不同容器的
in逻辑补充 - 列表/元组:遍历容器内元素依次执行
目标元素 == 当前元素判断,任意一次返回True则判定为存在 - 集合/字典key判断:先校验
hash(目标元素)和容器内对应元素的哈希值是否一致,再校验目标元素 == 对应元素,两者均符合才判定为存在,全程不会校验对象标识is
内容的提问来源于stack exchange,提问作者backstreetrover
相关产品推荐
相关产品推荐

