如何使用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 个回答
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'
的字典。实际上没有办法直接引用这个变量,因为这不是一个有效的 Python 标识符。每次你试图写出来,Python 都会把它理解为你在引用一个名为 b
的变量里的键。
3
globals
函数返回的字典可能包含每个全局变量的键,但这个字典里的每个键不一定都对应一个全局变量。具体来说,b["c"]
不是一个单独的全局变量,而是一种语法结构,用来获取 b
和 c
关联的值。下面的代码是可以运行的(但不一定推荐这样做):
>>> b = {}
>>> globals()["b"]["c"] = 1
>>> b
{'c': 1}
2
我不太明白你想要做什么。
b
似乎在全局变量中并不存在。你不能给一个不存在的字典赋值。
理论上,你可以这样做:
globals()["b"] = {'c': 5}
这样会让 b
成为一个新的字典,里面有一个键 c
,它的值是 5。不过,我建议你仔细想想,为什么你觉得需要修改全局变量,通常还有更好的方法可以实现你的目标。