如何判断Kivy弱引用是否指向指定对象?
判断原对象是否在弱引用列表中的解决方案
这个问题我之前处理Kivy触摸事件时也碰到过,确实因为grab_list里存的是弱引用对象,和原控件实例不是同一个实体,直接用if my_obj in my_list:肯定会返回False。给你几个实用的解决办法:
方法1:用any()遍历并解引用判断
这是最直接的单次判断方式,遍历列表里的每个弱引用,调用ref()获取原对象后用is做身份匹配:
if any(ref() is my_obj for ref in my_list): print("my_obj在grab_list里!")
如果担心对象已经被GC回收(此时ref()会返回None),可以加上非空判断避免误判:
if any(ref() is not None and ref() is my_obj for ref in my_list): print("my_obj存在且在grab_list里!")
方法2:转换为原对象集合(适合多次判断)
如果需要多次检查不同对象是否在列表里,先把有效弱引用转换成原对象的集合,后续判断会更高效:
# 先过滤掉已被回收的对象,生成原对象集合 active_grabbed_objects = {ref() for ref in my_list if ref() is not None} # 之后直接用in判断 if my_obj in active_grabbed_objects: # 执行你的逻辑
额外提示
因为弱引用的特性,一定要注意:如果原对象已经被Python的垃圾回收机制回收,ref()会返回None,所以在判断时最好先确认ref()不为空,避免把None当成有效对象处理。
内容的提问来源于stack exchange,提问作者Snow bunting
相关产品推荐
相关产品推荐

