【问题标题】:Can I variabalize an object like a dictionary reference in python我可以像python中的字典引用一样对对象进行变量化吗
【发布时间】:2011-10-13 01:56:51
【问题描述】:

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

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

但我很快了解到 dictName 是一个字符串,而不是对我的字典的引用。

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

我确实看到另一种方法是在我创建它们时将我的所有字典添加到一个列表中,然后遍历该列表 - 该解决方案仅在我写这个问题时才出现在我身上。但我很想知道是否有某种方法可以实现我的原始方法。

谢谢

【问题讨论】:

  • 你原来的做法是错误的。它甚至不适用于 Python 3。使用你的新方法。

标签: python dictionary variable-assignment


【解决方案1】:

您可以使用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

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

【讨论】:

  • 谢谢,这很有帮助,感谢您抽出宝贵时间
【解决方案2】:

eval() 可以做到:

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

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

内省方法getattrlocals() 同样有风险。它们很强大,它们可以让你做一些需要一行一行 C++ 的事情。但只有在绝对需要时才应使用它们。

就您而言,最好的解决方案是字典,正如其他人已经回答的那样。

【讨论】:

  • 谢谢,我忘记了 eval(),你是对的 - 我昨晚盯着我的代码,并决定需要一个更好的方法。我检查了你的答案,因为它确实符合我的要求。
【解决方案3】:

如果命名字典是对象的属性,您可以通过这种方式获取它们,使用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))

小心这种元编程,因为它可能是进入混淆代码领域的滑坡。

【讨论】:

  • 像我这样的人还有其他类型的代码吗?谢谢,这很有帮助。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多