Python3中id()运算符返回值解析及变量内存地址相关疑问
Python3中id()函数的常见疑问解答
问题背景
运行以下代码:
a = 5 b = 5 print(a == b) print(id(a) == id(b))
得到输出:
True True
疑问点:
- Python3中的
id()返回什么? - 为什么第二行输出也是
True?id()不是返回内存地址吗? - 常量5会被分配特定的内存地址吗?
- 如何获取变量a和b的内存地址?
1. id()函数的返回值
id()返回的是对象在其生命周期内唯一的整数标识。在主流的CPython解释器中,这个整数直接对应对象的内存地址(其他Python解释器的实现可能不同,但CPython是最常用的)。
2. 为什么a和b的id相同?
这是CPython的小整数缓存优化机制导致的:为了减少内存开销、提升运行效率,解释器会预先缓存-5到256之间的整数对象。当你给a和b都赋值为5时,并不会创建两个独立的整数对象,而是让它们都指向缓存中已经存在的那个5的对象,所以两者的id自然相等。
如果超出这个缓存范围,比如赋值257,在普通场景下(非同一代码块或交互行内),两个变量的id会不同:
a = 257 b = 257 print(id(a) == id(b)) # 输出False
但如果是在同一代码块(比如函数内)或同一行赋值,编译器可能会做额外优化,让它们指向同一个对象,此时id也会相同。
3. 常量5的内存地址问题
是的,在CPython的小整数缓存机制下,5这类小整数会被提前分配固定的内存地址。整个程序运行期间,只要你引用5,都会指向这个已缓存的对象,不会重新分配新内存。
4. 获取变量的内存地址
在CPython中,id()返回的整数就是变量所指向对象的内存地址。如果想要更直观的十六进制格式(符合内存地址的常见展示形式),可以用hex()函数转换:
a = 5 print(hex(id(a))) # 输出类似0x7f8b9c034080的十六进制地址
内容的提问来源于stack exchange,提问作者Timothty C.
相关产品推荐
相关产品推荐

