我(试图)在我的程序中使用globals()遍历所有全局变量。我就是这么做的:

for k, v in globals().iteritems():
    function(k, v)

当然,在这个过程中,我又创建了两个全局变量kv。所以我有个例外:
RuntimeError: dictionary changed size during iteration

下面是我为解决这个问题所做的各种不成功的尝试:
# Attempt 1:

g = globals()
for k, v in globals().iteritems():
    function(k, v)

# Attempt 2 (this one seems to work, but on closer inspection it duplicates
#the last item in the dictionary, because another reference is created to it):

k = v = None
for k, v in globals().iteritems():
    function(k, v)

。。。。这样做会产生一个错误。

最佳答案

您使用的是iteritems(),它在实时字典上迭代。您可以通过首先创建项的副本来轻松地避免这个问题;在Python 2中,只需使用globals().items()

for k, v in globals().items():
    function(k, v)

在Python 3中,您将使用list()首先将所有项对具体化为一个列表:
for k, v in list(globals().items()):
    function(k, v)

这个列表永远不会大到成为一个问题;模块globals很少大于几十个项目。
如果您觉得即使是几十个元组也是一个问题,那么只为键创建一个列表:
for k in list(globals()):  # python 2 and 3
    function(k, globals()[k])

关于python - 遍历globals()字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47996181/

10-13 02:29