Python arr=[1,2,3]的参考arr存储在哪里?
假设有这样一段C语言Python arr=[1,2,3]的参考arr存储在哪里?,python,c,pointers,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);
//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;
}
我的结论是:
ptr1=0x7ffeefc97a0
是arr[]
的地址,&ptr1
是指针或变量本身的存储位置
至于python
In [12]: arr = [1, 2, 3]
In [13]: hex(id(arr))
Out[13]: '0x106065088'
“0x106065088”是arr值的地址,那么引用“arr”存储在哪里呢?顶级名称的引用通过模块的名称空间绑定。如果您在解释器中运行,则该模块称为
\uuuu main\uuu
。模块通常会有一个\uuu dict\uuu
属性,该属性引用所有顶级名称(如'arr'
)到实际对象引用(如arr
引用的任何对象)的映射
通常,所有名称都存储在某种名称空间中。基本类型是对象名称空间,它们是相对永久的,通过\uuuuu dict\uuuuu
或描述符(例如\uuuuu slots\uuuuu
)工作,以及函数本地名称空间,它们仅在函数运行时存在。模块和类通常是具有重要名称空间的对象。当在本地命名空间中找不到名称时,有解析名称的规则。这些规则的通用名称是首字母缩略词LEGB
CPython执行一种称为引用计数的操作,以了解何时释放内存。当不再存在对对象的引用时,它将被垃圾收集并最终删除。由于这是特定解释器的一个实现细节,从技术上讲,一个对象可以在没有任何有效引用的情况下存在于内存中(至少用户无法访问这些对象,如果没有任何引用,最终会导致内存泄漏)。Python不会公开您所寻找的细节级别。
id(arr)
的值是一个地址,但它是一个实现细节id
只需在范围内返回一个唯一于arr
的整数arr
只是一个引用堆上某个对象的名称,而不是其本身的“东西”。你是在问Python是否支持指针吗?我想应该将引用存储在某个地方,而不是在空中飞行@madphypersis引用欧比-万·克诺比的话:“你不需要看到他的身份。”。我已经发布了一个关于我认为你的问题的答案。问题是什么还不清楚,但你最后的评论似乎有问题。
In [12]: arr = [1, 2, 3]
In [13]: hex(id(arr))
Out[13]: '0x106065088'