python与c++变量赋值的区别
python与c++变量赋值的区别
在C++中,变量赋值的行为与Python有显著不同,主要区别在于变量存储方式和赋值语义。以下是详细对比:
1. 基本类型(int, float等)
C++行为:
int a = 10;
int b = a; // 值拷贝(独立内存)
b = 20; // 修改b不影响a
cout << a; // 输出10(不变)
- 直接存储值,赋值是深拷贝(复制值到新内存)
- 变量名直接绑定到内存地址
Python行为:
a = 10
b = a # b和a引用同一个不可变对象
b = 20 # 创建新对象,不影响a
print(a) # 输出10
- 虽然表现类似,但本质是引用不可变对象而非值拷贝
2. 对象/类实例
C++行为:
class MyClass { public: int val; };MyClass obj1;
obj1.val = 10;
MyClass obj2 = obj1; // 默认浅拷贝(成员值复制)
obj2.val = 20; // 修改obj2不影响obj1
cout << obj1.val; // 输出10
- 默认浅拷贝(按成员复制值)
- 可通过重载
=
实现深拷贝
Python行为:
class MyClass: pass
obj1 = MyClass()
obj1.val = 10
obj2 = obj1 # 引用同一个对象
obj2.val = 20 # 修改会影响obj1
print(obj1.val) # 输出20
- 始终是引用传递,赋值不拷贝对象
c++里的引用: int& a=b;,这之后a还能再绑定到其他变量吗?
在C++中,引用(reference)一旦初始化后就不能重新绑定到其他变量,这是与指针(pointer)的关键区别之一。
int x = 10;
int y = 20;
int& a = x; // 引用a绑定到x(初始化)
a = y; // 这不是重新绑定!而是把y的值赋给x
- 初始化即永久绑定:引用在声明时必须初始化,且之后无法更改其绑定的目标
- 语法糖性质:引用本质是编译器实现的别名(编译后通常等同于指针,但语法上更安全)
但在Python里,a=b之后,a=c,a其实就绑定到c了,所以Python里一切赋值皆引用(虽然不可变对象的后续行为表现为值传递),而且引用了还能再重新绑定。