需要自引用字典时该怎么办?

70 投票
11 回答
27859 浏览
提问于 2025-04-16 04:17

我刚开始学Python,发现有些事情竟然做不了,感觉挺意外的。

dictionary = {
    'a' : '123',
    'b' : dictionary['a'] + '456'
}

我在想,怎么才能用Python的正确方式在我的脚本里实现这个功能,因为我觉得应该不止我一个人想过这个问题。

编辑:很多人对我在做什么感到好奇,所以我来详细说明一下我的用例。假设我想用字典来保存文件系统的路径。这些路径是相对于字典里其他值的。例如,我的字典可能长这样。

dictionary = {
    'user': 'sholsapp',
    'home': '/home/' + dictionary['user']
}

很重要的一点是,我随时都可能会改变 dictionary['user'] 的值,并希望所有字典里的值都能反映这个变化。再次强调,这只是我用它的一个例子,希望能传达我的目标。

根据我自己的研究,我觉得我需要实现一个类来完成这个功能。

11 个回答

8
>>> dictionary = {
... 'a':'123'
... }
>>> dictionary['b'] = dictionary['a'] + '456'
>>> dictionary
{'a': '123', 'b': '123456'}

这个代码运行得很好,但当你尝试使用 dictionary 时,它还没有被定义(因为它需要先处理那个字面上的字典)。

不过要小心,因为这段代码是把 'b' 这个键的值设置为 'a' 这个键在赋值时的值,而不是每次都去查找。如果你想要的是这种效果,当然可以做到,但需要更多的工作。

23

我找到的最接近的解决方案,不用对象:

dictionary = {
    'user' : 'gnucom',
    'home' : lambda:'/home/'+dictionary['user'] 
}

print dictionary['home']()
dictionary['user']='tony'
print dictionary['home']()
61

不用担心创建新类——你可以利用Python的字符串格式化功能,简单地这样做:

class MyDict(dict):
   def __getitem__(self, item):
       return dict.__getitem__(self, item) % self

dictionary = MyDict({

    'user' : 'gnucom',
    'home' : '/home/%(user)s',
    'bin' : '%(home)s/bin' 
})


print dictionary["home"]
print dictionary["bin"]

撰写回答