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

0 投票
3 回答
3876 浏览
提问于 2025-04-17 10:48

使用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"] 不是一个单独的全局变量,而是一种语法结构,用来获取 bc 关联的值。下面的代码是可以运行的(但不一定推荐这样做):

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

我不太明白你想要做什么。

b 似乎在全局变量中并不存在。你不能给一个不存在的字典赋值。

理论上,你可以这样做:

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

这样会让 b 成为一个新的字典,里面有一个键 c,它的值是 5。不过,我建议你仔细想想,为什么你觉得需要修改全局变量,通常还有更好的方法可以实现你的目标。

撰写回答