RuntimeError dictionary changed size during iteration 遍历字典时报错

RuntimeError: dictionary changed size during iteration

在字典遍历过程中修改字典长度时会报错;这里是遍历时修改了字典长度,导致了字典中有字典,一直在查找,直到RuntimError。


我是在用globals函数时,发现的问题:

# test.py
# version:Python3.6.0
def test1():
    pass

class Test2(object):
    def test3(self):
        pass

g_dict = globals()
# print(g_dict)

for key in (g_dict.keys()):
    print(f'{key}:{g_dict[key]}')

应该使用list将dict变为列表,才能遍历。

for key in list(g_dict.keys()):  
    print(f'{key}:{g_dict[key]}')

仔细一想,我在遍历时好像没有改变字典元素呀,原因在哪里?看了打印结果才感觉发现是globals()这个函数的原因:

打印结果:

__name__:__main__
__doc__:None
__package__:None
__loader__:<_frozen_importlib_external.SourceFileLoader object at 0x000001ED473AC240>
__spec__:None
__annotations__:{}
__builtins__:<module 'builtins' (built-in)>
__file__:D:/keeplearning/myLearning/python/book2/test.py
__cached__:None
test1:<function test1 at 0x000001ED472A3E18>
Test2:<class '__main__.Test2'>
g_dict:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001ED473AC240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/keeplearning/myLearning/python/book2/test.py', '__cached__': None, 'test1': <function test1 at 0x000001ED472A3E18>, 'Test2': <class '__main__.Test2'>, 'g_dict': {...}, 'key': 'g_dict'}

发现g_dict键的值中有递归了,g_dict的值中出现了’g_dict’: {…} 。

修改如下:

for key in list(g_dict.keys()):
    if not isinstance(g_dict[key],dict):
        print(f"{key}:{g_dict[key]}")

结果:

__name__:__main__
__doc__:None
__package__:None
__loader__:<_frozen_importlib_external.SourceFileLoader object at 0x00000217DCB3C240>
__spec__:None
__builtins__:<module 'builtins' (built-in)>
__file__:D:/keeplearning/myLearning/python/book2/test.py
__cached__:None
test1:<function test1 at 0x00000217DCA33E18>
Test2:<class '__main__.Test2'>

globals() 返回一个字典,表示当前的全局符号表。这个符号表始终针对当前模块(对函数或方法来说,是指定义它们的模块,而不是调用它们的模块)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值