下面是 Python、C++ 和 Java 三种语言中 数据类型(基本/内置类型)、容器类型(复合/集合类型),以及它们在 函数传参、返回值、赋值(=)、push 到 vector/list 等容器时 的 默认行为(是传值、引用还是指针语义)的详细对比。
📌 核心概念说明
- 传值(Value semantics):复制整个对象。
- 引用(Reference semantics):不复制对象,操作的是原对象的'别名'。
- 指针(Pointer semantics):显式或隐式通过地址操作对象(C++ 特有)。
- Java 和 Python 中没有真正的'指针',但有'对象引用'的概念(类似智能指针)。
- C++ 支持值、引用、指针三种方式,但默认是传值(除非显式用
&或*)。
✅ 对比表格
| 语言 | 数据类型(基本类型) | 容器类型(如 list/vector/map) | 函数传参(默认) | 返回值(默认) | 赋值(a = b) | push 到容器(如 vec.push_back(x)) |
|---|---|---|---|---|---|---|
| Python | int, float, bool, str(不可变)list, dict, set(可变) | 所有容器都是对象(可变) | 传对象引用(但不可变对象表现像传值) | 返回对象引用 | 绑定新名称到对象(不是复制) | 存储对象引用(不复制对象) |
| Java | int, double, boolean 等(primitive)String(不可变对象) | ArrayList, HashMap 等(对象) | primitive:传值 对象:传引用的值(即'按值传递引用') | primitive:返回值 对象:返回引用 | primitive:复制值 对象:复制引用(两个变量指向同一对象) | 存储对象引用(不复制对象) |
| C++ | int, double, bool, char 等 | std::vector, std::map, std::string 等 | 默认传值(复制) (可用 const& 避免拷贝) | 默认返回值(移动或拷贝) (RVO/NRVO 优化) | 深拷贝(除非重载=) |

