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)

 in 
      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

你可能感兴趣的:(Python,模块学习)