Python字典引用邻近字典元素

7 投票
2 回答
4169 浏览
提问于 2025-04-16 03:04

我正在尝试创建一个这样的东西:

dictionary = {
   'key1': ['val1','val2'],
   'key2': @key1
}

其中 @key1 是指向字典中 'key1' 这个键的内容。提前谢谢你。

2 个回答

4

使用一个新的类:

class DictRef(object):
    def __init__(self, d, key): self.d, self.key = d, key

d = {}
d.update({
    'key1': ['val1','val2'],
    'key2': DictRef(d, 'key1')
})

注意这里的语法有点奇怪,因为你无法知道你是在哪个字典里面创建 DictRef

4

我想扩展一下Aaron Digulla的版本。他现在的内容在这里重复了一遍:

class DictRef(object):
    def __init__(self, d, key): self.d, self.key = d, key

d = {}
d.update({
    'key1': ['val1','val2'],
    'key2': DictRef(d, 'key1')
})

我假设他希望实现真正的引用语义,这样访问 'key2' 时,总能找到 'key1' 的值。问题是,虽然 d['key1'] 是一个 list,但是 d['key2'] 是一个 DictRef。所以,要获取 'key1' 的“值”,你只需要用 d['key1'],但对于 'key2',你必须用 d[d['key2'].key]。而且,你不能有一个引用的引用,这样会变得很复杂,变成 d[d[d['key2'].key].key]。那么,怎么区分一个引用和一个普通值呢?可能需要通过类型检查,比如用 isinstance(v, DictReference) 来判断 (ew)。

所以我有一个提议来解决这些问题。

就我个人而言,我不明白为什么真正的引用语义是必要的。如果看起来很必要,其实可以通过重新构建问题或解决方案来让它变得不必要。甚至可能根本就不需要,简单的 d.update(key2=d['key1']) 就能解决这个问题。

无论如何,接下来是我的提议:

class DictRef(object):
    def __init__(self, d, key): 
        self.d = d
        self.key = key

    def value(self):
        return self.d[self.key].value()

class DictVal(object):
    def __init__(self, value):
        self._value = value

    def value(self):
        return self._value

d = {}
d.update(
    key1=DictVal(['val1', 'val2']),
    key2=DictRef(d, 'key1')
)

现在,为了获取 任何 键的值,无论它是否是引用,只需用 d[k].value()。如果有引用的引用,它们会正确地按顺序解引用。如果形成了一个非常长或无限的链,Python 会因为过度递归而报 RuntimeError 错误。

撰写回答