【问题标题】:Where does reference arr stored of arr = [1, 2, 3]?arr = [1, 2, 3] 的引用 arr 存储在哪里?
【发布时间】:2019-03-21 02:04:18
【问题描述】:

假设C有这样一个sn-p

//ptr_ops.c -- pointer operations
#include <stdio.h>
int main(void)
{
    int arr[] = {100, 200, 300, 400, 500};
    int *ptr1, ptr2, ptr3;

    ptr1 = arr;
    printf("&ptr1 = %p, ptr1 = %p, *ptr1 = %d", &ptr1, ptr1, *ptr1);

    return 0;
}

它产生:

In [11]: !./a.out
&ptr1 = 0x7ffeeefc9790, ptr1 = 0x7ffeeefc97a0, *ptr1 = 100

我的结论是:

ptr1 = 0x7ffeeefc97a0arr[] 的地址,&amp;ptr1 是存储指针或变量本身的位置。

关于python

In [12]: arr = [1, 2, 3]
In [13]: hex(id(arr))
Out[13]: '0x106065088'

'0x106065088'是arr的值的地址,引用“arr”呢,它存放在哪里?

【问题讨论】:

  • Python 不会公开您正在寻找的详细程度。 id(arr) 的值是一个地址,但它是一个实现细节; id 只需要返回一个在作用域内对arr 唯一的整数。 arr 只是一个名称,它指代堆上的一个对象,而不是一个“事物”本身。
  • 你是在问 Python 是否支持指针?
  • 我想参考应该存储在某个地方而不是在空中飞行@MadPhysicist
  • 引用欧比旺克诺比的话:“你不需要看他的身份证明。”。
  • @rider。我已经发布了我认为您的问题的答案。目前还不清楚问题是什么,但您的最后一条评论似乎有问题。

标签: python c pointers


【解决方案1】:

对顶级名称的引用通过模块的命名空间绑定。如果您在解释器中运行,则该模块称为__main__。模块通常会有一个__dict__ 属性,该属性引用所有顶级名称(如'arr')到实际对象引用(如arr 所指的任何内容)的映射。

通常,所有名称都存储在某种命名空间中。基本类型是对象命名空间,它们是相对永久的,可以通过__dict__ 或描述符(例如__slots__)工作,以及仅在函数运行时存在的函数局部命名空间。模块和类通常是具有重要命名空间的对象。当在本地命名空间中找不到名称时,有解析名称的规则。这些规则的通用名称是首字母缩写词 LEGB。

CPython 会做一些称为引用计数的事情来了解何时释放内存。当不再存在对对象的引用时,它会被垃圾收集并最终被删除。由于这是特定解释器的实现细节,从技术上讲,一个对象可以存在于内存中,而无需 任何 对其的有效引用(至少用户无法访问,根本没有任何引用,你会最终导致内存泄漏)。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2015-07-31
    • 2012-11-26
    • 2022-01-20
    相关资源
    最近更新 更多