如何使用python globals()更新字典变量?

时间:2012-01-21 22:54:45

标签: python globals

使用globals()分配字符串,整数等工作正常:

 
>>> globals()
{'__builtins__': , '__name__': '__main__', '__doc__': None, '__package__': None}
>>> globals()["a"] = 5
>>> a
5
>>> globals()
{'__builtins__': , '__name__': '__main__', '__doc__': None, 'a': 5, '__package__': None}

但是,尝试分配到字典失败:

>>> globals()["b['c']"] = 5
>>> globals()
{'a': 5, "b['c']": 5, '__builtins__': , '__package__': None, '__name__': '__main__', '__doc__': None}
>>> b['c']
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'b' is not defined

即使“b”已被定义为字典,也是如此。

因此,给定一个文本字符串,例如“b ['c']”,如何指定b ['c']?

3 个答案:

答案 0 :(得分:2)

我无法想象你在这里想做什么。

b似乎不存在于全局变量中。您无法分配不存在的字典。

可以想象,你可以这样做:

globals()["b"] = {'c': 5}

使b成为包含一个键c的新字典,值为5.但我会仔细考虑为什么你认为你需要首先修改全局变量 - 这是几乎可以肯定是做你想做的更好的方式。

答案 1 :(得分:2)

globals返回的字典可能包含每个全局变量的键,但并非该字典中的每个键都需要与全局变量对应。具体来说,b["c"]不是单个全局变量,而是用于访问bc关联的值的语法结构。以下工作(但不一定推荐):

>>> b = {}
>>> globals()["b"]["c"] = 1
>>> b
{'c': 1}

答案 2 :(得分:1)

您如何分配字典中包含的字典?

>>> outer = {'inner': { 'foo': 'bar' }}
>>> print outer['inner']['foo']
bar

>>> outer['inner']['foo'] = 'baz'
>>> print outer['inner']['foo']
baz

globals()只返回存储全局变量的字典。变量名是键。因此,您可以像访问任何其他字典一样访问它(以及其中的任何嵌套结构)。

>>> globals()['outer']['spoon'] = 'fork'
>>> print outer['spoon']
'fork'

如果您发现这一点令人困惑,只需使用更多中间变量将其分解为一步:

>>> g = globals()         # fetch the globals() dictionary into g
>>> o = g['outer']        # fetch the outer dictionary from g into o
>>> o['spoon'] = 'fork'   # store 'fork' under the key 'spoon' in o

尝试使用您尝试的语法执行相同的“分解为更小的步骤”,您会发现:

>>> g = globals()         # fetch the globals() dictionary into g
>>> g["b['c']"] = 5       # store 5 under the key "b['c']" in g

在这里,您已使用键"b['c']"将值插入到字典中。使用字典这是一件非常好的事情,所以你不会有任何错误。但这完全无意义地映射回变量。

您所做的工作与创建名为b['c']的变量相对应。不是名为b的变量,它指的是带有键'c'的字典。没有经过globals()就无法实际引用此变量,因为那不是有效的Python标识符。每当你尝试写出来时,Python只会在你引用一个名为b的变量中的键时解释它。