开发者社区> 问答> 正文

字典无限循环意外退出

正在尝试在Python中创建无限循环的各种方法(除了通常之外while True),并提出了这个想法:

x = {0: None}

for i in x:

del x[i]
x[i+1] = None  # Value doesn't matter, so I set it to None
print(i)

我找到了无限循环的方式:

我依次通过字典中的键值
我删除了那个条目。
循环中的当前计数器位置+ 1将是具有None更新字典的值的新键。
我输出当前的计数器。
在我看来,这应该以一种无限循环的方式输出自然数:

0
1
2
3
4
5
.
.
.
我认为这个想法很聪明,但是当我在Python 3.6上运行时,它会输出:

0
1
2
3
4
它在5次迭代后以某种方式停止了。显然,循环的代码块中没有基本条件或标记值,那么为什么Python只运行此代码5次?

展开
收起
一码平川MACHEL 2019-01-23 15:53:25 1867 0
1 条回答
写回答
取消 提交回答
  • 如果你在循环中改变它,则无法保证迭代所有dict条目。
    在字典中添加或删除条目时迭代视图可能会引发RuntimeError或无法迭代所有条目。

    您可以创建一个“枚举”无限循环,类似于您最初使用的尝试itertools.count()。例如:

    from itertools import count

    for i in count():

    print(i)
    # don't run this without some mechanism to break the loop, i.e.
    # if (i == 10):
    #     break
    

    OUTPUT

    0

    1

    2

    ...and so on


    我刚刚在python2和python3中测试了你的代码

    python3 output
    0,1,2,3,4
    python2
    0,1,2,3,4,5,6,7
    有一件事可能会发生。当您创建第一个键值时,字典中只分配了一定量的内存,当您删除键值时,我们不会分配任何内存或释放内存,而只是删除值。一旦使用了所有分配的内存,它就会退出。因为如果你在没有del的情况下运行,你将收到此错误

    RuntimeError: dictionary changed size during iteration
    因此python为该键值创建了足够的内存以及更多内存,一旦用完,就不再为字典分配内存。

    2019-07-17 23:26:41
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载