假设这样的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”怎么样,它存储在哪里?
答案 0 :(得分:4)
对顶级名称的引用通过模块的命名空间进行绑定。如果您在解释器中运行,则该模块称为Proxy.joins(:configs).where(country: country)
.where("capacity > ?", :configs.count)
.order_by(:configs.count)
。模块通常将具有一个__main__
属性,该属性引用所有顶级名称(如__dict__
)到实际对象引用(如'arr'
所引用的内容)的映射。
通常,所有名称都存储在某种命名空间中。基本类型是对象名称空间,它们是相对永久的,可以通过arr
或描述符(例如__dict__
)来工作,而函数局部名称空间则仅在函数运行时才存在。通常,模块和类是具有重要名称空间的对象。如果在本地名称空间中找不到名称,则存在解析规则。这些规则的通用名称是缩写LEGB。
CPython执行称为引用计数的操作,以了解何时释放内存。当不再有对对象的引用时,将收集垃圾并最终将其删除。由于这是特定解释器的实现细节,因此,从技术上讲,对象可以在没有任何有效引用的情况下驻留在内存中(至少用户无法访问的对象,完全没有任何引用,您会最终会导致内存泄漏。