假设这样一个 C 代码片段
//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 = 0x7ffeeefc97a0
是arr[]
的地址,&ptr1
是存储指针或变量本身的位置。
关于Python
In [12]: arr = [1, 2, 3]
In [13]: hex(id(arr))
Out[13]: '0x106065088'
'0x106065088'是arr值的地址,那么引用“arr”呢,它存储在哪里?
最佳答案
对顶级名称的引用通过模块的 namespace 绑定(bind)。如果您在解释器中运行,则该模块称为 __main__
。模块通常有 __dict__
引用所有顶级名称(如 'arr'
)到实际对象引用(如 arr
引用的任何内容)的映射的属性。
一般来说,所有名称都存储在某种命名空间中。基本类型是对象命名空间,它们相对永久,可以通过 __dict__
工作。或描述符(例如 __slots__
)和函数本地命名空间,仅在函数运行时存在。通常,模块和类是具有重要 namespace 的对象。当在本地命名空间中找不到名称时,有一些规则可以解析该名称。这些规则的通用名称是缩写 LEGB。
CPython 执行称为引用计数的操作来了解何时释放内存。当不再存在对某个对象的引用时,该对象将被垃圾收集并最终被删除。由于这是特定解释器的实现细节,从技术上讲,一个对象可以存在于内存中,而无需任何对其的有效引用(至少用户无法访问,根本没有任何引用,您将最终导致内存泄漏)。
关于python - arr = [1, 2, 3] 的引用 arr 存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52837147/