arr = [1、2、3]的引用arr存储在哪里?

时间:2018-10-16 13:54:30

标签: python c pointers

假设这样的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 = 0x7ffeeefc97a0arr[]的地址,&ptr1是指针或变量本身的存储位置。

关于python

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

'0x106065088'是arr的值的地址,引用“ arr”怎么样,它存储在哪里?

1 个答案:

答案 0 :(得分:4)

对顶级名称的引用通过模块的命名空间进行绑定。如果您在解释器中运行,则该模块称为Proxy.joins(:configs).where(country: country) .where("capacity > ?", :configs.count) .order_by(:configs.count) 。模块通常将具有一个__main__属性,该属性引用所有顶级名称(如__dict__)到实际对象引用(如'arr'所引用的内容)的映射。

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

CPython执行称为引用计数的操作,以了解何时释放内存。当不再有对对象的引用时,将收集垃圾并最终将其删除。由于这是特定解释器的实现细节,因此,从技术上讲,对象可以在没有任何有效引用的情况下驻留在内存中(至少用户无法访问的对象,完全没有任何引用,您会最终会导致内存泄漏。