需要自引用字典时该怎么办?
我刚开始学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"]