通过globals()字典迭代
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过globals()字典迭代相关的知识,希望对你有一定的参考价值。
我(尝试)在我的程序中使用globals()
迭代所有全局变量。这就是我的方式:
for k, v in globals().iteritems():
function(k, v)
当然,在这样做的过程中,我只创建了两个全局变量k
和v
。所以我得到了这个例外:
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()字典迭代的主要内容,如果未能解决你的问题,请参考以下文章