Это проистекает из следующего
for i in range(2):
pass
print i is 1
после того, как итерирование значения i
лениво сохранено в качестве его окончательного значения.
В качестве генератора функция будет работать (т. е. печатать каждое значение по очереди), но при преобразовании в список он запускается через генератор, поэтому все вызовы cage
(cage.animal
) возвращают кошек.