0

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

 
>>> 全局变量()
{'__builtins__': , '__name__': '__main__', '__doc__': 无, '__package__': 无}
>>> globals()["a"] = 5
>>> 一个
5
>>> 全局变量()
{'__builtins__': , '__name__': '__main__', '__doc__': 无, 'a': 5, '__package__': 无}

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

>>> globals()["b['c']"] = 5
>>> 全局变量()
{'a': 5, "b['c']": 5, '__builtins__': , '__package__': 无, '__name__': '__main__', '__doc__': 无}
>>> b['c']
回溯(最近一次通话最后):
  文件“”,第 1 行,在
NameError:未定义名称“b”

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

那么,给定一个文本字符串,例如“b['c']”,我该如何分配 b['c']?

4

3 回答 3

2

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

b似乎已经不存在于全局变量中了。您不能分配给不存在的字典。

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

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

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

于 2012-01-21T22:59:31.860 回答
2

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

>>> b = {}
>>> globals()["b"]["c"] = 1
>>> b
{'c': 1}
于 2012-01-21T23:06:05.310 回答
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

在这里,您已将值 with 插入到带有 key 的字典中"b['c']"。这对字典来说是一件非常好的事情,所以你不会得到任何错误。但这完全是胡说八道,映射回变量。

您所做的对应于创建一个名为 的变量b['c']。不是一个变量b,它引用了一个带有 key 的字典'c'。如果不通过globals(),就无法实际引用此变量,因为这不是有效的 Python 标识符。每次您尝试将其写出时,Python 都会将其解释为您引用名为b.

于 2012-01-21T23:19:04.650 回答