使用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']?
答案 0 :(得分:2)
我无法想象你在这里想做什么。
b
似乎不存在于全局变量中。您无法分配不存在的字典。
可以想象,你可以这样做:
globals()["b"] = {'c': 5}
使b
成为包含一个键c
的新字典,值为5.但我会仔细考虑为什么你认为你需要首先修改全局变量 - 这是几乎可以肯定是做你想做的更好的方式。
答案 1 :(得分:2)
globals
返回的字典可能包含每个全局变量的键,但并非该字典中的每个键都需要与全局变量对应。具体来说,b["c"]
不是单个全局变量,而是用于访问b
与c
关联的值的语法结构。以下工作(但不一定推荐):
>>> 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
的变量中的键时解释它。