我有一个复杂的数据结构(多维dict和元组列表),它被多个函数过滤,最后返回可删除对象的列表或字典,类似于:
import sys
d1 = {'a': 1, 'd': 3, 'f': 4, 'g': 5, 'h': 6, 'j': 7, 'k': 8, 'l': 9, 's': 2}
d2 = {1: 'a', 2: 's', 3: 'd', 4: 'f', 5: 'g', 6: 'h', 7: 'j', 8: 'k', 9: 'l'}
def filter1(d1, d2):
dd1 = {k:v for k,v in d1.items() if k not in ['a','l']}
dd2 = {k:v for k,v in d2.items() if k not in [4, 6]}
return dict(dd1.items() + dd2.items())
def filter2(d):
return {k:v for k,v in d.items() if not isinstance(v, int) if 3 < k < 8}
f = filter2(filter1(d1,d2))
通过查看引用计数,这些对象似乎指向相同的值。而且他们的身份证也完全一样。在
^{pr2}$在过滤了最终产品之后,我基本上得到了一个引用的dict。从该dict中删除对象应自动从d1
,d2
中删除原始属性。在
我想知道是否可以通过id删除这些对象,或者以某种方式销毁对它们值的引用,让垃圾收集器来完成这项工作?在
否则,我的过滤器函数必须跟踪每个对象是从哪个dict[key]
获取的,然后显式删除。这是一个相当困难和容易出错的工作。。。在
期望输出:
^{3}$
我不能直接用它来修改您的示例,但是IMHO最接近您需求的Python工具是弱引用。在
弱引用可以引用一个对象,只要它存在,但是当最后一个对它的硬引用消失时,该对象不再有效,可以被垃圾回收。当你试图获得对一个不再活动的对象的引用时,你却得不到任何引用。在
因此,如果你想删除引用dict中的对象,就必须用ref dict中对象的弱引用替换原始dict中的对象。这样,当你从另一个dict中移除对象时,弱ref不足以保持对象的存活,它就会消失。在
但正如我在开始时所说的,我不能将其应用到您的示例中,因为您通过保持良好的值来构造过滤列表,而weakref会要求您首先将everythin放入filtered list中,然后删除您不希望保留的内容。在
不,不能使用对象的
id()
删除对该对象的引用。您必须从d1
和d2
中删除正确的键才能删除这些引用。在让过滤器返回一个set的需要从那些字典中删除的键,然后循环该集合并显式删除这些键:
我使用
dict.pop()
允许密钥丢失。在相关问题 更多 >
编程相关推荐