python - 变量赋值存储在内存的什么位置?
问题描述
y=5
id(5)
id(y)
在 cpython 中,两个 id 命令会返回相同的内存地址,整数 5 存放在哪里,但是 y等于 5 的信息存放在哪里呢?
为什么知道 5 存储在内存中的位置很重要,但知道 y 等于 5 的存储位置并不重要?
另外,使用python时是否可以将数字5存储在内存中的多个位置?为什么或者为什么不?
解决方案
id(y)
并id(5)
说出有5
问题的存储位置,而不是存储y
本身(名称)的位置。
自身的位置y
(持有指向表示 的对象的指针的名称5
)是一个实现细节;在 CPython 中,函数局部名称存储在调用函数时创建的数组中,并在函数完成时清理,而全局名称存储在每个模块中dict
(可见为globals()
)。函数的__code__
属性包含有关局部变量的信息,但不提供对数组的直接访问(因为这将允许 Python 代码破坏解释器不变量,或者依赖于即使在微版本之间也可能发生变化的实现细节)。
知道在哪里5
并不重要。该id
函数并非旨在提供实际位置,这只是分配 CPython 使用的唯一 ID 的便捷方式。在像 PyPy 这样的非 CPython 解释器中,它实际上根本不需要描述内存地址(它们以其他方式分配唯一的 ID,因为垃圾收集意味着内存地址在对象的生命周期内不稳定)。的重点id
是关于身份;这两个东西是同一个对象吗(也可以用is
运算符测试),而不仅仅是值相等。
至于您的问题“使用 python 时是否可以将数字 5 存储在内存中的多个位置?”,CPython 的答案是“否”,但语言规范没有做出这样的保证。id(y)
并且id(5)
是相同的,只是因为实现细节,小int
缓存。在 CPython 上,int
s from -5
to 256
(包括)是单例;无论您如何获得它们(数学、解析字符串、文字等),每个都只有一个。但是对于int
超出该范围的 s ,它们是按需创建的,因此id
在大多数情况下 s 不会重叠:
>>> y = 500
>>> id(y)
2538476592176
>>> id(500)
2538471826288
推荐阅读
- go - 如何使用 vscode 调试 go 1.11.x
- ios - 即使正在设置图像,也不会在 UIImageView 中显示
- android - 在 Android 上存储传感器数据和转储事件文件
- python - 如何从 Expressroute 授权中检索响应
- php - 根据数据库中的值更改标记颜色
- javascript - 使用 JQuery/CSS 跨页滑动 Div
- wordpress - 克隆 Wordpress 多站点 // 暂存到生产环境 // AWS
- java - 如何通过前缀将 JSON 属性映射/分组到带有杰克逊的对象列表?
- java - 使两个子视图中的对象相等
- sql - 从昨天22:00开始的postgresql查询记录