Python通过销毁对i的引用删除值

2024-06-16 13:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个复杂的数据结构(多维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中删除对象应自动从d1d2中删除原始属性。在

我想知道是否可以通过id删除这些对象,或者以某种方式销毁对它们值的引用,让垃圾收集器来完成这项工作?在

否则,我的过滤器函数必须跟踪每个对象是从哪个dict[key]获取的,然后显式删除。这是一个相当困难和容易出错的工作。。。在

期望输出:

^{3}$

Tags: 对象函数in列表forifdefnot
2条回答

我不能直接用它来修改您的示例,但是IMHO最接近您需求的Python工具是弱引用。在

弱引用可以引用一个对象,只要它存在,但是当最后一个对它的硬引用消失时,该对象不再有效,可以被垃圾回收。当你试图获得对一个不再活动的对象的引用时,你却得不到任何引用。在

因此,如果你想删除引用dict中的对象,就必须用ref dict中对象的弱引用替换原始dict中的对象。这样,当你从另一个dict中移除对象时,弱ref不足以保持对象的存活,它就会消失。在

但正如我在开始时所说的,我不能将其应用到您的示例中,因为您通过保持良好的值来构造过滤列表,而weakref会要求您首先将everythin放入filtered list中,然后删除您不希望保留的内容。在

不,不能使用对象的id()删除对该对象的引用。您必须从d1d2中删除正确的键才能删除这些引用。在

让过滤器返回一个set的需要从那些字典中删除的键,然后循环该集合并显式删除这些键:

for key in filter2(filter1(d1,d2)):
    d1.pop(key, None)
    d2.pop(key, None)

我使用dict.pop()允许密钥丢失。在

相关问题 更多 >