通过globals()字典迭代

问题描述 投票:2回答:1

我(尝试)在我的程序中使用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这样的帖子处理相同的异常。这是不同的,因为无法为每个字典条目分配变量而不为其创建变量名称...这样做会引发错误。

python iteration
1个回答
8
投票

您正在使用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])
© www.soinside.com 2019 - 2024. All rights reserved.