About Python字典的学习笔记_1

在对字典进行迭代的过程中进行字典的修改操作是危险的!

Author:Iron
Date: 2019/7/4

在插入新值时,Python 可能会按照散列表的拥挤程度来决定是 否要重新分配内存为它扩容。
如果增加了散列表的大小,那散列值 所占的位数和用作索引的位数都会随之增加,这样做的目的是为了减少发生散列冲突的概率。
如果你在迭代一个 字典的所有键的过程中同时对字典进行修改,那么这个循环很有可能会跳过一些键——甚至是跳过那些字典中已经有的键。

From 《流畅的Python》

然而,python2没有规避用户的这种不合理操作。
python3对于用户的这种操作抛出runtimeError,避免了用户在迭代散列表的时候,删除散列表中的值或者新增散列表中的值,从而导致扩容改变散列值,破坏了一次正常的迭代行为。
因此迭代与修改操作,是不允许同时出现的。

Python 3环境下:

op = {a:chr(a) for a in range(65,76)}
flag = 0
words = ''
newwords = ''
for key,letter in op.items():
     if key == 69:
          del op[key]    
     if flag == 0:
          op['ii'] = 'op'         
     words += letter
     flag +=1
print(words)
print('-'*10)
for letter in op.values():
     newwords += letter
print(newwords)
---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

<ipython-input-32-0b026b4e2336> in <module>
      3 words = ''
      4 newwords = ''
----> 5 for key,letter in op.items():
      6      if key == 69:
      7           del op[key]


RuntimeError: dictionary changed size during iteration

python 2环境下:

可以得到下面的输出:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值