Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python arr=[1,2,3]的参考arr存储在哪里?_Python_C_Pointers - Fatal编程技术网

Python arr=[1,2,3]的参考arr存储在哪里?

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);

假设有这样一段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;
}
我的结论是:

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'