Объекты в реализации CPython размещаются в куче, и то же самое происходит с «кадрами стека». Размер «кадра стека» предварительно вычисляется во время компиляции.
Однако по причинам, которые мне не на 100% ясны, существует использование стека C для вложенных вызовов функций (но не для аргументов или локальных переменных) . Это по-прежнему означает, что бесконечная рекурсия на CPython вызовет sh из-за исчерпания стека C намного раньше, чем исчерпание памяти. Можно было бы реализовать виртуальную машину для использования фиксированного количества C стека, независимо от того, насколько глубокой была вложенность вызовов в коде Python, но это не так.
Обратите внимание также, что небольшой целые числа (например, 3
), однако, являются общими, то есть новый целочисленный объект не всегда выделяется. Поскольку целые числа неизменяемы, это трудно заметить, кроме случаев использования id
, но это важная оптимизация по соображениям скорости.