Как назначить адрес памяти для переменной в Python? - PullRequest
5 голосов
/ 29 апреля 2011

вот сценарий:

Я по глупости забываю присвоить возвращаемый объект переменной:

>>> open("random_file.txt")
<open file 'random_file.txt', mode 'r' at 0x158f780>

Есть ли способ напрямую назначить адрес памяти переменной?Что-то примерно эквивалентное

int *ptr;
*ptr = 0x158f780;

Контрапункты:

  1. В этом случае я могу просто отбросить объект - файл открывается в режиме чтения, и объект будетсобранные GC.Но меня интересует решение для сценария, в котором мне нужно освободить ресурс детерминированным способом.

  2. Я предполагаю, что часть "at 0x158f780" это просто id ()объекта - который является адресом памяти в CPython («это зависит от реализации и может измениться, бла-бла»).Поэтому меня интересуют оба сценария - было бы здорово привязать переменную к значению id () (более переносимо, а что нет), но привязка к пустому адресу памяти также была бы в порядке

  3. Я немного погуглил по поводу чего-либо, связанного с «указателем питона», присвоением адреса переменной / памяти и тому подобным, но, похоже, мой гугл-фу недостаточно силен.Приветствия,

    РЕДАКТИРОВАТЬ:

    Некоторые касательные после чтения ответов и просмотра документов Python: на объект файла ссылается REPL _ var.Как только _ присваивается результат следующей команды, я предполагаю, что его refcount равен 0. Файловый объект удаляется из памяти, и если мы предполагаем, что он реализует вменяемый метод __del__, он должен позаботиться обо всехдетали низкого уровня, то есть закрытие файла и так далее.http://docs.python.org/reference/datamodel.html#object.__del__ подробно описывает общий сценарий.

    Вот и я добавлю 0.0.0.0 stackoverflow.com в /etc/hosts...

Ответы [ 2 ]

15 голосов
/ 29 апреля 2011

Python - язык высокого уровня. Вы не можете (не в любом случае напрямую) связываться с адресами памяти, поэтому ответ - нет.

Однако REPL удобно хранить результат последнего выражения в магической переменной _. Вы можете получить его оттуда. Процитирую ваш пример.

>>> open("/etc/passwd","r") #Oops I forgot to assign it
<open file '/etc/passwd', mode 'r' at 0x7f12c58fbdb0>
>>> f = _ # Not to worry. It's stored as _
>>> f
<open file '/etc/passwd', mode 'r' at 0x7f12c58fbdb0>
>>> 
3 голосов
/ 29 апреля 2011

Вы не можете, по той же причине, по которой вы не можете выделять и освобождать память самостоятельно и не можете разыгрывать (как в «давайте переосмыслим этот кусок памяти, как если бы это выглядело так»): работа с памятью на этот уровень считается подверженным ошибкам, неважным и автоматизируемым для включения в язык. Радуйся, что так, ты, вероятно, испытал бы несколько сбоев и тонких ошибок, вызванных теперь дураками, которые, хотя они были бы умны и злоупотребляли чем-то подобным образом.

Поскольку у других есть состояния, последний напечатанный объект сохраняется в _ с помощью REPL, так что вы можете использовать его, если это происходит во время интерактивного сеанса, и вы достаточно быстро его ловите.

(Обратите внимание, что, строго говоря, вы можете написать расширение CPython, которое предоставляет функцию для получения Python int, получения необработанного распакованного значения и приведения его к PyObject *. И ужасно, и непрактично.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...