【问题标题】:How to assign a memory address to a variable in Python?如何将内存地址分配给 Python 中的变量?
【发布时间】:2011-04-29 09:10:28
【问题描述】:

这是场景:

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

>>> 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. 我在 google 上搜索了一些与“python 指针”相关、变量/内存地址分配和类似的东西,但似乎我的 google-fu 不够强大。

干杯,

编辑:

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

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

【问题讨论】:

  • 虽然不是你直接要求的,但在python解释器中你可以从_变量中得到前一行的返回值,所以ptr = _会给你你想要的——打开文件对象。
  • 非常几个问题不值得关心。即使是决定不关心他们也需要深思熟虑。简单地忽略事情通常是一件坏事。
  • @Noufal Ibrahim:“很少有不值得关心的问题”虽然是真的,但这显然是少数几个如此超越规则以至于成为典型事物的问题之一达到惊人的无关性。

标签: python variables pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    由于其他人有状态,最后打印的对象由 REPL 存储在 _ 中,因此如果它发生在交互式会话期间,您可以使用它并且您很快就会捕获它。

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

    【讨论】:

    • 完全同意手动内存管理位。谢天谢地,在 C 时代,我不必做任何大到足以重要的事情。哦,好吧,对于那些虚假的怀旧之痛,总是有梅尔的故事。
    • FWIW,我确实必须编写 C 扩展,它将一个内存区域转换为一个结构,该结构将用 Python 数据的 C 等效项填充。这可以传递给 IOCTL 以完成一些低级别的工作。这并不总是完成,但可能而且有时是必要的。
    • 转换至少在一个主要的 Python 模块中完成:NumPy,它允许用户对数组执行低级转换。
    • @EOL:如果你指的是cast[]()函数,那不是我说的演员阵容,也就是所谓的转换。以另一种方式做(取一块充满 int 值的内存,然后将其视为充满浮点数)会导致完全无意义的值。
    • @delnan:我指的是a = numpy.array(range(8)),它创建了一个由8 个int32 整数组成的数组,但是您可以使用a.dtype = 'int8' 转换为一个32 字节的数组。实际上,NumPy 让您以不同的方式查看底层内存。
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多