首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历globals()字典

遍历globals()字典
EN

Stack Overflow用户
提问于 2017-12-28 01:20:49
回答 1查看 2.3K关注 0票数 2

我正(尝试)在我的程序中使用globals()来迭代所有的全局变量。我是这样做的:

代码语言:javascript
复制
for k, v in globals().iteritems():
    function(k, v)

当然,在这样做的过程中,我只是创建了另外两个全局变量:kv。所以我得到了这个例外:

代码语言:javascript
复制
RuntimeError: dictionary changed size during iteration

下面是我解决这个问题的各种不成功的尝试:

代码语言:javascript
复制
# 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这样处理相同异常的帖子。这是不同的,因为在不为每个字典条目指定变量名称的情况下,无法将其分配给每个字典条目。这样做会引发错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-28 01:22:26

您使用的是iteritems(),它遍历实时字典。您可以通过首先创建项的副本来避免这个问题;在Python2中,只需使用globals().items()

代码语言:javascript
复制
for k, v in globals().items():
    function(k, v)

在Python3中,您将首先使用list()将所有项对物化到一个列表中:

代码语言:javascript
复制
for k, v in list(globals().items()):
    function(k, v)

这个列表永远不会大到成为一个问题;模块全局变量很少会超过几十个项目。

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

代码语言:javascript
复制
for k in list(globals()):  # python 2 and 3
    function(k, globals()[k])
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47996181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档