Я случайно написал такой код:
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 целевом выражении должно быть разрешено только одиночные идентификаторы и кортежи идентификаторов. Есть ли какая-то ситуация, в которой это действительно полезно, а не просто странная добыча?