如何在Python中为变量分配内存地址?

时间:2011-04-29 09:10:28

标签: python variables pointers

这是场景:

我愚蠢地忘记将返回的对象分配给变量:

>>> 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()值会很好(更便携,什么不可以),但是将它绑定到裸存储器地址也是O.K。

  3. 我做了一些谷歌,因为任何“python指针”相关,可变/内存地址分配和类似,但似乎我的google-fu不够强大。

  4. 干杯,

    修改

    阅读答案并浏览python文档后的一些切线:文件对象由REPL _ var引用。一旦_被分配给下一个命令的结果,我假设它的引用计数变为0.文件对象从内存中删除,如果我们假设它实现了一个健全的__del__方法,它应该照顾所有低级细节,即关闭文件等。 http://docs.python.org/reference/datamodel.html#object.__del__详细介绍了一般情况。

    那我和我将把0.0.0.0 stackoverflow.com添加到/ etc / hosts ...

2 个答案:

答案 0 :(得分:15)

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>
>>> 

答案 1 :(得分:3)

你不能,出于同样的原因你不能自己分配和释放内存而且不能转换(如“让我们重新解释这块内存就好像它看起来像这样”)的东西:处理内存这个级别被认为容易出错,不重要且可自动化以包含在语言中。很高兴就是这样,你可能会经历一些崩溃和微妙的错误,现在由傻瓜引起,虽然他们很聪明并且滥用了这些内容。

正如其他人所说的那样,打印的最后一个对象由REPL存储在_中,因此如果在交互式会话期间发生这种情况,您可以使用它,并且很快就能抓住它。

(请注意,严格来说,您可以编写一个CPython扩展,它提供一个函数来获取Python int,获取原始的未装箱值并将其转换为PyObject *。这两者都非常糟糕且不切实际。)