Я предполагаю CPython здесь.
В примере 1 y
поддерживается структурой C ListObject
, выделенной в куче, которая (с некоторыми атрибутами) length
целое число и массив Object*
указателей.
Несмотря на проверку ошибок, что-то вроде y[1234]
заканчивается аналогом y->entries[1234]
.
В примере 2 вызов функция генератора выделяет генератор, который содержит состояние функции генератора.
Вызов next()
для генератора будет запускать код функции генератора до следующего yield
. В этот момент состояние функции (и далее, range()
, которая также является генератором), состояние сохраняется, и значение возвращается через next()
вызывающей стороне. Для генератора сами значения не сохраняются (если вы, например, не изменяете массив).
Надеюсь, это поможет.