首页 > 解决方案 > 变量赋值存储在内存的什么位置?

问题描述

y=5
id(5)
id(y)

在 cpython 中,两个 id 命令会返回相同的内存地址,整数 5 存放在哪里,但是 y等于 5 的信息存放在哪里呢?

为什么知道 5 存储在内存中的位置很重要,但知道 y 等于 5 的存储位置并不重要?

另外,使用python时是否可以将数字5存储在内存中的多个位置?为什么或者为什么不?

标签: pythonpython-3.xmemorymemory-management

解决方案


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 上,ints from -5to 256(包括)是单例;无论您如何获得它们(数学、解析字符串、文字等),每个都只有一个。但是对于int超出该范围的 s ,它们是按需创建的,因此id在大多数情况下 s 不会重叠:

>>> y = 500
>>> id(y)
2538476592176
>>> id(500)
2538471826288

推荐阅读