首页 > 解决方案 > 了解 Python 中的内存寻址

问题描述

我写这篇文章是为了扩大我对如何pointersmemory-addressing工作的理解python

Python是一种高级语言,我了解到内存管理由python负责。

我还了解到指针可以用id()对象来识别。

假设我有两个变量ab,这两个变量可以用以下命令交换:

a,b=b,a

identity可以使用以下方法找到这些变量的变化。

>>> a=2
>>> b=3
>>> id(a)
140732857872688
>>> id(b)
140732857872720
>>> a,b=b,a
>>> a
3
>>> b
2
>>> id(a)
140732857872720
>>> id(b)
140732857872688

如您所见,ids它们被交换了(如预期的那样),换句话说,我们可以说ids分配给的变量被交换了。这在python中是如何发生的?

再举一个例子,

>>> i=0
>>> id(i)
140732857872624
>>> i+=1
>>> id(i)
140732857872656

i增加 时1,如何在后台创建具有相同名称的新变量(我称其为新变量,因为身份正在更改)?

我还添加了一个示例以进一步扩展我的问题!

操作一:

>>> i,j=0,0
>>> id(i)
140732857872624
>>> id(j)
140732857872624
>>> i,j = i+1,i+1
>>> i
1
>>> j
1
>>> id(i)
140732857872656
>>> id(j)
140732857872656

操作2:

>>> i,j=0,0
>>> i=i+1
>>> j=i+1
>>> i
1
>>> j
2
>>> id(i)
140732857872656
>>> id(j)
140732857872688

当然,操作 1 和操作 2 是不同的。这两个操作如何在低级别发生。

一旦已经分配的指针不再使用,它​​将如何被重用?如果 amemory-address不能在给定程序中重用并且必须为每个新操作(在同一个程序中)赋予新的,这是使用高深度memory-address时内存溢出的原因吗?recursion

我希望我已经把我的问题说清楚了。

如果我的理解在任何地方有错误,请纠正我。来自机械工程背景,虽然我已经编程了很长一段时间,但这件事让我很困惑。

问候

标签: pythonpointersmemory-address

解决方案


要了解正在发生的事情,一个简单的心理模型是

  1. 每个 python 变量都是一个指针。
    即使i=1在 Python 内部i是指向包含值 1 的对象的指针之后。即使整数也是普通对象(这在其他语言中并不常见,通常变量最终直接包含小整数的值)。

  2. 出于效率原因,一些不可变对象被缓存和共享。
    如果所有具有值的变量0都是指向同一个对象的指针,那么在 Python 程序中会缓存小整数。在第二种情况下,您观察到不同id的 s 因为值不同(i将指向 1 并将j指向 2)。
    请注意,共享仅针对不可变对象进行,因为除非使用id共享,否则无法在代码中观察到。在 Python 中,这是针对小数字和一些小字符串(那些最终被“实习”的)完成的。


推荐阅读