При каких обстоятельствах `sys.getrefcount()` может вернуть ноль?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 При каких обстоятельствах `sys.getrefcount()` может вернуть ноль?

Сообщение Anonymous »

Я читал официальную документацию Python 3.12 по модулю sys, и часть о getrefcount() кажется мне довольно запутанной (выделено мной).
< blockquote>
Возвращает счетчик ссылок на объект. Возвращаемое значение
обычно на единицу больше, чем вы могли ожидать, поскольку оно включает
(временную) ссылку в качестве аргумента функции getrefcount().
Обратите внимание, что возвращаемое значение может на самом деле не отражать количество
действительно удерживаемых ссылок на объект. Например, некоторые объекты
«бессмертны» и имеют очень высокий счетчик ссылок, который не отражает
фактического количества ссылок. Следовательно, не полагайтесь на то, что возвращаемое
значение будет точным, кроме значений 0 или 1.

Изменено в версии 3.12: бессмертные объекты имеют очень большое количество ссылок
, которое не соответствует фактическому количеству ссылок на объект.


Когда в Python вызывается sys.getrefcount(expr), то, по крайней мере, имеется ссылка на объект, полученный из expr: ссылка из самого getrefcount(). Например, следующий код возвращает минимально возможное возвращаемое значение getrefcount(), насколько я понимаю, равное 1.

Код: Выделить всё

import sys
print(sys.getrefcount(object()))
Я подозреваю, что это неточность документации из-за прямой копии документации Py_REFCNT. Обратите внимание, что один абзац дублирует тот же текст, что и ранее процитированная документация.

Получите счетчик ссылок объекта Python o.
Обратите внимание, что возвращаемое значение может не отражать фактическое количество
ссылок на объект. Например, некоторые объекты
«бессмертны» и имеют очень высокий счетчик ссылок, который не отражает
фактического количества ссылок. Следовательно, не полагайтесь на точность возвращаемого
значения, отличного от значения 0 или 1.
Используйте функцию Py_SET_REFCNT(), чтобы установить счетчик ссылок на объекты.

Изменено в версии 3.10: Py_REFCNT() заменена на встроенную статическую
функцию.


Изменено в версии 3.11: тип параметра больше не является const PyObject*.
< /blockquote>

В случае Py_REFCNT() я считаю, что разумно возвращать нулевое значение, поскольку передача указателя на Py_REFCNT() не формирует автоматически дополнительную ссылку на базовый объект Python. Однако я не верю, что может быть случай, когда функция getrefcount() из модуля Python sys может возвращать ноль.
Я что-то упускаю очевидные или какие-то крайние случаи? Есть ли случай, когда sys.getrefcount() может возвращать ноль, как в настоящее время упоминается в документации? Было бы лучше, если бы кто-нибудь мог уточнить, что на самом деле означает выделенное жирным шрифтом предложение. Означает ли это, что возвращаемое значение 3 (довольно распространенный случай) sys.getrefcount() следует считать неточным?

Подробнее здесь: https://stackoverflow.com/questions/788 ... eturn-zero
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»