同值不同变量的内存地址为何在Python与C++中表现不一致?
同值变量在Python与C++中地址表现差异的底层原理
Python侧的实现逻辑
- Python的核心模型是一切皆对象,变量本身没有独立的存值内存空间,本质是绑定到对象上的引用,你可以把它理解成贴在对象上的名字标签:赋值操作不是把值拷贝到变量的专属空间,只是把变量这个标签贴到对应值的对象上。
- 主流的CPython解释器默认做了小整数驻留优化:启动阶段就会提前创建好
-5到256区间所有整数的全局唯一对象,后续代码中所有给变量赋这个区间内的整数值时,都不会新建对象,直接让变量指向提前创建好的全局对象,这时候用id()获取的对象内存地址自然完全一致。 - 除了小整数,短字符串、部分不可变类型在满足条件时也会触发驻留优化,本质都是解释器为了减少重复对象创建、降低内存开销做的实现层优化,不是Python语言规范强制要求的行为。如果赋值的是超出驻留范围的数值、或者列表/字典这类可变对象,哪怕两个变量的值完全相同,通常也会指向不同的对象,
id()返回的地址就会不一样。
a = 10 b = 10 print(id(a) == id(b)) # 输出True,二者指向同一个驻留的小整数对象 c = 257 d = 257 print(id(c) == id(d)) # 交互式环境下通常输出False,未触发驻留时会新建独立对象
C++侧的实现逻辑
- C++是静态编译的原生语言,变量在声明时就会根据其存储类型(栈、堆、全局存储区等)分配独立的专属内存空间。给两个不同变量赋相同值的本质,是把相同的数值拷贝到两个变量各自的独立内存中,两个变量本身对应完全不同的内存位置,用
&取地址自然会得到不同的结果。 - C++中只有显式定义引用、或者用指针指向同一个已有变量时,才会出现地址相同的情况,这和Python默认的引用语义有本质区别。
#include <iostream> using namespace std; int main() { int a = 10; int b = 10; cout << (&a == &b) << endl; // 输出0(false),a、b是栈上独立分配的int变量,地址互不相同 int& c = a; // c是a的引用,和a绑定到同一块内存 cout << (&a == &c) << endl; // 输出1(true) return 0; }
核心差异总结
两门语言的表现差异本质来自完全不同的变量模型:Python的变量是绑定到对象的标签,多个标签完全可以贴到同一个对象上;C++的变量本身就是承载值的独立内存容器,不同容器哪怕装完全相同的内容,本身的存储位置也不一样。
- 需要注意:C++编译器在高优化等级下,也可能对同值的常量做常量合并优化,让它们共享同一块内存,但这属于编译器可选的优化策略,不是语言层面的固定语义,和Python的驻留优化性质类似,都不能作为“同值变量一定地址相同”的通用依据。
内容的提问来源于stack exchange,提问作者Hritik _
相关产品推荐
相关产品推荐

