Я случайно написал такой код:
foo = [42]
k = {'c': 'd'}
for k['z'] in foo:  # Huh??
    print k
Но, к моему удивлению, это была не синтаксическая ошибка. Вместо этого он печатает {'c': 'd', 'z': 42}.
Мое предположение заключается в том, что код переводится буквально в нечто вроде:
i = iter(foo)
while True:
    try:
        k['z'] = i.next()  # literally translated to assignment; modifies k!
        print k
    except StopIteration:
        break
Но... почему это разрешено языком? Я ожидал бы, что в для-stmt целевом выражении должно быть разрешено только одиночные идентификаторы и кортежи идентификаторов. Есть ли какая-то ситуация, в которой это действительно полезно, а не просто странная добыча?