通过globals()字典迭代

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过globals()字典迭代相关的知识,希望对你有一定的参考价值。

我(尝试)在我的程序中使用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)

我见过像this这样的帖子处理相同的异常。这是不同的,因为无法为每个字典条目分配变量而不为其创建变量名称...这样做会引发错误。

答案

您正在使用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)

该清单永远不会成为一个问题;模块全局变量很少大于几十个项目。

如果您觉得即使是几十个元组也是一个问题,那么只为密钥创建一个列表:

for k in list(globals()):  # python 2 and 3
    function(k, globals()[k])

以上是关于通过globals()字典迭代的主要内容,如果未能解决你的问题,请参考以下文章

内置函数

13 个非常有用的 Python 代码片段

通过理解迭代字典并获得字典[重复]

函数--内置函数匿名函数

迭代 Python 中的字典或列表

使用字典而不是 globals()