Следующий код показывает, что это не очень хорошо определено:
def f(x):
return x
def g(x):
return x+1
def h(x):
return x+10
try:
d = {1:"a", 2:"b", 3:"c"}
for k, v in d.iteritems():
del d[f(k)]
d[g(k)] = v+"x"
print d
except Exception as e:
print "Exception:", e
try:
d = {1:"a", 2:"b", 3:"c"}
for k, v in d.iteritems():
del d[f(k)]
d[h(k)] = v+"x"
print d
except Exception as e:
print "Exception:", e
Первый пример вызывает g (k) и выдает исключение (словарь изменил размер во время итерации).
Второй пример вызывает h (k) и не выдает исключений, но выдает:
{21: 'axx', 22: 'bxx', 23: 'cxx'}
Что, глядя на код, кажется неправильным - я бы ожидал что-то вроде:
{11: 'ax', 12: 'bx', 13: 'cx'}