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

如何在Python中为变量分配内存地址?,python,variables,pointers,Python,Variables,Pointers,以下是场景: 我愚蠢地忘记将返回的对象分配给变量: >>> open("random_file.txt") <open file 'random_file.txt', mode 'r' at 0x158f780> 要点: 在这种情况下,我可以丢弃该对象——文件以读取模式打开,对象将由GC收集。但我感兴趣的是一个解决方案,用于需要以确定性方式释放资源的场景 我假设“at 0x158f780”部分只是对象的id(),它恰好是CPython中的内存地址(“这是特定于实现

以下是场景:

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

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

  • 在这种情况下,我可以丢弃该对象——文件以读取模式打开,对象将由GC收集。但我感兴趣的是一个解决方案,用于需要以确定性方式释放资源的场景

  • 我假设“at 0x158f780”部分只是对象的id(),它恰好是CPython中的内存地址(“这是特定于实现的,可能会更改,等等”)。所以我对这两种情况都感兴趣——将一个变量绑定到id()值会更好(更具可移植性等等),但将它绑定到一个裸内存地址也可以

  • 我在谷歌上搜索了一些与“python指针”相关的变量/内存地址分配和类似的东西,但我的谷歌fu似乎不够强大

  • 干杯

    编辑:

    阅读答案并浏览python文档后,出现了一些偏差:文件对象由REPL u变量引用。一旦将u分配给下一个命令的结果,我假设其refcount变为0。文件对象将从内存中删除,如果我们假设它实现了一个sane
    \uuu del\uuu
    方法,那么它应该负责所有低级细节,即关闭文件等等。详细说明了一般情况


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

    Python是一种高级语言。你不能(无论如何不能直接)弄乱内存地址,所以答案是否定的

    然而,REPL确实可以方便地将最后一个表达式的结果存储在一个神奇变量
    \uu
    中。你可以从那里取。引用你的例子

    >>> 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>
    >>> 
    
    >>打开(“/etc/passwd”,“r”)#哎呀,我忘了分配它了
    >>>不用担心。它存储为_
    >>>f
    >>> 
    
    你不能,因为同样的原因,你不能自己分配和释放内存,也不能强制转换(就像“让我们重新解释这段内存,就像它看起来是这样”)事情:在这个级别上处理内存被认为是容易出错的,不重要的,并且可以自动包含在语言中。很高兴这样,你可能已经经历了一些崩溃和微妙的错误,这些错误是由傻瓜们造成的,他们认为他们很聪明,并且滥用了这些东西

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


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

    尽管不是您直接要求的,在python解释器中,您可以从
    \uu
    变量中获取前一行的返回值,因此
    ptr=\u
    将为您提供所需的内容--打开的文件对象。很少有问题不值得关注。即使决定不关心他们也需要深思熟虑。简单地忽略事情通常是一件坏事。@Noufal Ibrahim:“很少有不值得关心的问题”虽然是真的,但这显然是少数几个超越规则的问题之一,以至于成为那些达到惊人程度的无关事物的典型代表。完全同意手动内存管理的观点。谢天谢地,在C时代,我不需要做任何大到足以产生影响的事情。哦,好吧,对于那些虚假的怀旧之痛,总是有关于梅尔的故事。FWIW,我确实需要编写C扩展,将内存区域转换为一个结构,用C等价物Python数据填充。这可以被传递到IOCTL中,以完成一些低级的工作。这并不总是可以完成的,但有时是可能的,而且是必要的。强制转换至少在一个主要的Python模块中完成:NumPy,它允许用户对数组执行低级强制转换。@EOL:如果您提到
    cast[]()
    函数,那不是我所说的强制转换,这也是所谓的转换。用另一种方法(取一块充满int值的内存,然后把它当作充满浮点数的内存)会导致完全没有意义的值。@delnan:我指的是
    a=numpy.array(range(8))
    ,它创建了一个由8
    int32
    整数组成的数组,但是您可以使用
    a.dtype='int8'
    将其转换为32字节的数组。实际上,NumPy让您以不同的方式查看底层内存。
    >>> 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>
    >>>