Python字典引用邻居字典元素

时间:2010-08-20 13:23:29

标签: python dictionary

我正在尝试创建以下内容:

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

其中@ key1引用字典['key1']。 提前谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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']listd['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以进行过度递归。