You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何基于对象身份(is运算符)检查对象是否在可枚举对象中?

基于对象身份检查已访问节点的方案

如果你想基于对象身份(也就是判断是否是同一个实例,对应is运算符)来检查节点是否已访问,有两种实用的方式:

方法一:遍历列表,用is逐一判断

如果还是想用列表存已访问节点,可以用any()函数配合生成器表达式,直接用is做身份判断:

visited_nodes = []
current_node = 你的当前节点

if any(current_node is node for node in visited_nodes):
    # 节点已访问过,处理循环逻辑,比如终止递归
    print("检测到环,终止递归")
else:
    visited_nodes.append(current_node)
    # 继续递归处理节点逻辑
    process_node(current_node)

这种方法逻辑直观,适合节点数量不多的场景,缺点是每次检查都是O(n)时间复杂度。

方法二:用集合存储节点ID,高效检查

如果要追求更高的检查效率(O(1)时间复杂度),可以用集合存储每个节点的id()——id()函数返回对象的唯一身份标识(对应内存地址),不管节点类有没有重写__eq__方法,这个标识都是唯一的:

visited_ids = set()
current_node = 你的当前节点

node_id = id(current_node)
if node_id in visited_ids:
    # 处理环的逻辑
    print("检测到环,终止递归")
else:
    visited_ids.add(node_id)
    # 继续递归处理
    process_node(current_node)

这种方法效率更高,适合节点数量较多的场景,而且完全不受__eq__重写的影响,是最稳妥的方式。

补充说明:如果你的节点类没有重写__eq__和__hash__方法,其实直接把节点放进集合里,current_node in visited_set也会等价于身份判断——因为默认的__eq__就是基于is实现的。但如果节点类重写了__eq__(比如按属性值判断相等),这种方式就会失效,所以存id()是更通用的方案。

内容的提问来源于stack exchange,提问作者Camion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:02:13