Есть две вещи, которые не охватываются превосходным ответом пользователя .
Сначала в Python была добавлена слабая версия в версии 2.1.
Для всего, что было добавлено после 2.1 (включая object
и type
), по умолчанию добавлялась поддержка слабых ссылок, если только для этого не было веской причины.
Но для всего, что уже существовало, особенно для довольно маленьких, таких как int
, добавление еще 4 байтов (большинство реализаций Python были 32-битными в то время, так что давайте просто назовем указатель 4 байта) может вызвать заметное снижение производительности для всего кода Python, который был написан для 1.6 / 2.0 или ранее. Таким образом, нужно было добавить более высокую планку для добавления поддержки слабых ссылок к этим типам.
Во-вторых, Python позволяет реализации объединять значения встроенных типов, которые, как он может доказать, являются неизменяемыми, и для некоторых из этих встроенных типов CPython использует это. Например (детали варьируются в зависимости от версии, поэтому возьмите это только в качестве примера):
- Целые числа от -5 до 255, пустая строка, односимвольные печатаемые строки ASCII, пустые байты, однобайтовые байты и пустой кортеж получают экземпляры-одиночки, созданные при запуске, и большинство попыток создать новое значение, равное вместо одного из этих синглетонов вместо этого получите ссылку на синглтон.
- Многие строки кэшируются в внутренней таблице строк, и многие попытки создать строку с тем же значением, что и для интернированной строки, вместо этого получают ссылку на существующую.
- В пределах одного модуля компиляции компилятор объединит две отдельные константы, которые равны целые числа, строки, кортежи целых чисел и строки и т. Д., В две ссылки на одну и ту же константу.
Таким образом, слабые стороны этих типов не будут такими полезными, как вы изначально думали. Многие значения просто никогда не исчезнут, потому что это ссылки на синглтоны, константы модуля или интернированные строки. Даже те, кто не бессмертен, у вас, вероятно, больше ссылок на них, чем вы ожидали.
Конечно, есть некоторые случаи, когда слабые ссылки были бы полезны в любом случае. Если я вычислю миллиард больших целых чисел, большинство из них не будут бессмертными или разделенными. Но это означает, что они полезны реже для этих типов, что должно учитываться при взвешивании компромиссов увеличения каждых 4 байтов до int, чтобы вы могли сэкономить память, безопасно высвобождая их в некоторых относительно редких случаях. .