我可以像python中的字典引用一样变形对象

时间:2011-10-13 01:56:51

标签: python dictionary variable-assignment

我有一系列字典,其中包含我想在最后组合的值。这种组合很混乱所以我不能只根据键组合我必须工作的词典并做出一些谨慎的选择。当我创建词典时,我在表单项#Dict中创建它们,期望做类似的事情

for value in ['8','10','11','12','13','14','15','18','19','20']:
    dictName='item'+value+'Dict'

但是我很快就知道dictName是一个字符串而不是我字典的引用。

有没有办法使用某种模式类型方法来引用我的字典?

我确实看到替代方法是在创建它们时将所有词典添加到列表中,然后遍历列表 - 只有在我编写此问题时才会出现该解决方案。但我有兴趣知道是否有某种方法可以实现我原来的方法。

由于

3 个答案:

答案 0 :(得分:2)

您可以使用locals函数获取包含当前本地范围内变量的字典:

>>> var0 = 7
>>> var1 = 3
>>> var2 = 4
>>> var3 = 5
>>> for i in range(4):
...    print 'var', i, 'is', locals()['var%d' % i]
... 
var 0 is 7
var 1 is 3
var 2 is 4
var 3 is 5

虽然,我不建议这样做。我建议将你的变量放入字典或列表中,就像你在帖子中提到的那样。

答案 1 :(得分:1)

如果它们是对象的属性,您可以使用getattr()以这种方式获取命名词典。

class MyClass:
    def __init__(self):
        self.item1dict = {}
        self.item2dict = {}

    def print_all_dicts(self):
        for x in [1,2]:
            print getattr(self, 'item{0}dict'.format(x))

请注意这种元编程,因为它可能是陷入模糊代码的滑坡。

答案 2 :(得分:1)

eval()可以做到:

>>> d = {'a':'first', 'b':'second'}
>>> d == eval('d')
True

但要小心!这是一个滑坡。使用eval()会产生安全漏洞,速度很慢,而且会鼓励意大利面条代码。

内省方法getattrlocals()同样存在风险。它们很强大,它们可以让你做一些需要C ++线条和线条的东西。但它们只应在绝对需要时使用。

在您的情况下,最好的解决方案是字典词典,其他人已经回答过。