Код выглядит запутанным из-за того, что изменяется список array, который использует генератор.
Ключ к пониманию этого кода:
— Цикл for использует первоначальный список array = [21, 49, 15].
— Условие if использует новый список array = [0, 49, 88].
Причина такого поведения заключается в поздней привязке (late binding) условного выражения. Это означает, что условие внутри генератора оценивается в момент обращения к элементу генератора, а не в момент его создания.
Если немного модифицировать код, можно увидеть, что происходит:
array = [21, 49, 15]
gen = ((x, print(x, array)) for x in array)
array = [0, 49, 88]
При выполнении этого кода вывод будет следующим:
21 [0, 49, 88]
49 [0, 49, 88]
15 [0, 49, 88]
Этот вывод показывает, что цикл for итерирует по исходному списку
[21, 49, 15], в то время как условие if проверяет элементы уже нового списка [0, 49, 88]. Единственным числом, которое присутствует в обоих списках, является 49, поэтому условие array.count(x) > 0 истинно лишь для этого числа, и итоговый результат будет [49].