python - 了解 Python 中的内存寻址
问题描述
我写这篇文章是为了扩大我对如何pointers
和memory-addressing
工作的理解python
。
Python是一种高级语言,我了解到内存管理由python负责。
我还了解到指针可以用id()
对象来识别。
假设我有两个变量a
和b
,这两个变量可以用以下命令交换:
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
我希望我已经把我的问题说清楚了。
如果我的理解在任何地方有错误,请纠正我。来自机械工程背景,虽然我已经编程了很长一段时间,但这件事让我很困惑。
问候
解决方案
要了解正在发生的事情,一个简单的心理模型是
每个 python 变量都是一个指针。
即使i=1
在 Python 内部i
是指向包含值 1 的对象的指针之后。即使整数也是普通对象(这在其他语言中并不常见,通常变量最终直接包含小整数的值)。出于效率原因,一些不可变对象被缓存和共享。
如果所有具有值的变量0
都是指向同一个对象的指针,那么在 Python 程序中会缓存小整数。在第二种情况下,您观察到不同id
的 s 因为值不同(i
将指向 1 并将j
指向 2)。
请注意,共享仅针对不可变对象进行,因为除非使用id
共享,否则无法在代码中观察到。在 Python 中,这是针对小数字和一些小字符串(那些最终被“实习”的)完成的。
推荐阅读
- mysql - 如何在表格中制作表格
- python - 使用 Python 列表理解创建此列表 [[2]、[3]、[4]、[3]、[4]、[5]、[4]、[5]、[6]]
- android - listview smoothscrolltoposition(position) 总是跳到第一项
- python - 如何更新 Tensorflow 列表中的选定变量?
- cobol - MULTIPLY 的行为不像我预期的那样
- migration - RxJS 迁移 5 到 6 - 使用 TakeUntil 取消订阅
- angularjs - ngMaterialDatePicker 依赖注入在 gulp serve:dist 期间失败
- php - 带图像输入的多字段表单
- c++ - 如何从字符串创建 lua 表?
- git - 管道中的Gitlab git身份验证