Кортежи в CPython представлены структурой
В процессе создания кортежа, если размер не превышает 20, сначала проверяется наличие свободного кортежа подходящего размера в
Несмотря на то, что кортежи в Python считаются неизменяемыми, в C-API существует возможность их изменения через функцию
В целях эксперимента, возможно мутировать кортежи напрямую, изменяя их память с помощью
PyTupleObject
, которая включает в себя массив указателей на объекты и размер кортежа. Длина кортежа хранится в поле ob_size
, что обеспечивает быстрый доступ к размеру за O(1). При создании кортежа, CPython использует механизм переиспользования памяти freelist
для кортежей размером менее 20. Это позволяет ускорить аллокацию и деаллокацию. При создании и уничтожении кортежей вызываются функции tuple_alloc
и tp_dealloc
соответственно. Изображение носит иллюстративный характер
В процессе создания кортежа, если размер не превышает 20, сначала проверяется наличие свободного кортежа подходящего размера в
freelist
. Если такой кортеж найден, он переиспользуется. В противном случае память выделяется динамически. При деаллокации, кортежи размером менее 20 могут быть добавлены в freelist
, чтобы в будущем можно было переиспользовать их память. Этот процесс включает в себя уменьшение ссылок на объекты внутри кортежа и очистку памяти. Несмотря на то, что кортежи в Python считаются неизменяемыми, в C-API существует возможность их изменения через функцию
PyTuple_SetItem
. Однако эту функцию рекомендуется использовать только при создании кортежей. Использование PyTuple_SetItem
для изменения уже существующих кортежей считается нарушением правил. Функция проводит проверку счётчика ссылок. В целях эксперимента, возможно мутировать кортежи напрямую, изменяя их память с помощью
ctypes
. Это демонстрирует внутреннюю мутабельность кортежей на уровне C, но крайне не рекомендуется к использованию в реальных проектах из-за потенциальных проблем. Разработчики CPython планируют сделать кортежи полностью неизменяемыми даже на уровне C-API, но на данный момент существуют проблемы обратной совместимости.