鱼C论坛

 找回密码
 立即注册
查看: 3032|回复: 8

关于字典的一点疑惑

[复制链接]
发表于 2015-3-13 10:37:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. 假设a = {1:0, 2:0, 3:1, 4:1}
  2. 要删除字典a中所有value为0的item,可以这样写:
  3. >>> for i in a.keys():
  4.          if a[i] == 0:
  5.                    del a[i]
  6. 这在python2.7.8中可以正常运行,返回结果是:
  7. >>> a
  8. {3: 1, 4: 1}
  9. 但在python3.4.2中却运行错误,错误代码:
  10. RuntimeError: dictionary changed size during iteration
  11. 执行结果,只删除了一个:
  12. >>> a
  13. {2: 0, 3: 1, 4: 1}

  14. 这算不算3.x的一个BUG呢?该怎么解决呢?
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-3-13 11:15:55 | 显示全部楼层
这个和列表是一样的。迭代情况下最好不要改变被迭代的对象,否则会发生诡异的情况。
列表的话可以a[:]
字典可以a.copy()
  1. a = {1:0, 2:0, 3:1, 4:1}
  2. for i in a.copy().keys():
  3.         if a[i] == 0:
  4.                 del a[i]
  5. print(a)

  6. {3: 1, 4: 1}
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-13 11:13:32 | 显示全部楼层
不知道哎 ( ⊙ o ⊙ )啊! 我先去试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-13 13:29:13 | 显示全部楼层
wei_Y 发表于 2015-3-13 11:15
这个和列表是一样的。迭代情况下最好不要改变被迭代的对象,否则会发生诡异的情况。
列表的话可以a[:]
字 ...

3Q 回答的很完美!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-13 20:00:31 | 显示全部楼层
当然不是BUG。。。python 3不允许在迭代过程中添加或者删除一个key

但是可以这样
  1. temp = a[:]
  2. a = {}

  3. for i in temo.keys():
  4.     if temp[i] != 0:
  5.         a.update({i: temp[i]})
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-13 22:14:54 From FishC Mobile | 显示全部楼层
支持楼上

来自:鱼C论坛 iPhone客户端来自: iPhone客户端
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-14 21:46:57 | 显示全部楼层
我最近也学到了这里,mark
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-15 20:01:24 | 显示全部楼层
MARK
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-3-18 14:39:37 | 显示全部楼层
看看吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-15 04:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表