news 2026/8/2 0:32:36

传值还是传引用?c++,python对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
传值还是传引用?c++,python对比

下面是 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))
Pythonint,float,bool,str(不可变)
list,dict,set(可变)
所有容器都是对象(可变)传对象引用(但不可变对象表现像传值)返回对象引用绑定新名称到对象(不是复制)存储对象引用(不复制对象)
Javaint,double,boolean等(primitive)
String(不可变对象)
ArrayList,HashMap等(对象)primitive:传值
对象:传引用的值(即“按值传递引用”)
primitive:返回值
对象:返回引用
primitive:复制值
对象:复制引用(两个变量指向同一对象)
存储对象引用(不复制对象)
C++int,double,bool,charstd::vector,std::map,std::string默认传值(复制)
(可用const&避免拷贝)
默认返回值(移动或拷贝)
(RVO/NRVO 优化)
深拷贝(除非重载=)默认 push 值(调用拷贝构造或移动构造)

🔍 详细解释

1.Python

  • 所有变量都是对象的引用
  • 不可变对象(如int,str,tuple):
    • 赋值或传参时,虽然传递的是引用,但由于不可变,修改会创建新对象,看起来像传值
  • 可变对象(如list,dict):
    • 传参、赋值、push 都是共享同一个对象,修改会影响所有引用
  • 示例:
    deff(lst):lst.append(4)# 修改原 lista=[1,2,3]f(a)print(a)# [1,2,3,4] → 引用语义

2.Java

  • 两种类型
    • 基本类型(primitive)int,double等 →传值
    • 引用类型(对象):包括String,ArrayList等 →传“引用的副本”(即不能改变原引用,但能修改对象内容)。
  • 赋值和容器存储都是复制引用,不复制对象本身。
  • 示例:
    voidf(ArrayList<Integer>list){list.add(4);// 修改原对象// list = new ArrayList<>(); // 这不会影响调用者}

3.C++

  • 默认一切是值语义(除非你显式使用引用或指针)。
  • 传参
    • void f(vector<int> v)→ 拷贝整个 vector。
    • void f(const vector<int>& v)→ 推荐,避免拷贝。
  • 返回值
    • vector<int> f()→ 通常通过移动语义RVO 优化避免拷贝。
  • 赋值
    • a = b→ 调用拷贝赋值运算符(深拷贝)。
  • push_back
    • vec.push_back(x)→ 调用拷贝构造(若 x 是左值)或移动构造(若 x 是右值)。
  • 示例:
    voidf(vector<int>v){/* v 是副本 */}voidg(constvector<int>&v){/* 不拷贝 */}vector<int>data={1,2,3};vec.push_back(data);// 拷贝vec.push_back(move(data));// 移动(data 变为空)

📊 行为总结表(按操作)

操作PythonJavaC++
传参(基本/不可变)引用(表现如值)值(primitive) / 引用副本(对象)值(拷贝)
传参(容器/可变)引用(共享对象)引用副本(可修改内容)值(拷贝整个容器,除非用&
返回值返回对象引用primitive:值;对象:引用返回值(通常移动或 RVO 优化)
赋值 a = ba 绑定到 b 所指对象primitive:值拷贝;对象:引用拷贝深拷贝(调用 operator=)
push 到容器存储对象引用存储对象引用拷贝或移动元素(值语义)

✅ 结论对比

语言内存模型默认语义是否容易意外共享?
Python所有都是对象引用引用语义✅ 容易(尤其可变对象)
Javaprimitive 值 + 对象引用混合(primitive 值,对象引用)✅ 对象容易共享
C++值语义为主,可选引用/指针值语义(安全但可能低效)❌ 默认不共享(需显式用&*

如有特定场景(如“如何在 C++ 中避免拷贝?”或“Python 如何实现深拷贝?”),可进一步展开。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 16:38:15

中国辅助驾驶“新竞赛”打响,高智价比AI芯片如何定义新标杆?

中国辅助驾驶的落地竞速已经从单纯的性能比拼&#xff0c;进入“法规与体验双轮驱动”的全新阶段。一方面&#xff0c;包括中国在内的全球多个国家和地区已对车辆搭载AEB系统提出强制性要求&#xff0c;直接推动了组合辅助驾驶进入市场主导的“爆发期”。根据《高工智能汽车研究…

作者头像 李华
网站建设 2026/7/31 22:46:57

渔人的直感:FF14终极智能钓鱼计时器完全指南

渔人的直感&#xff1a;FF14终极智能钓鱼计时器完全指南 【免费下载链接】Fishers-Intuition 渔人的直感&#xff0c;最终幻想14钓鱼计时器 项目地址: https://gitcode.com/gh_mirrors/fi/Fishers-Intuition 还在为错过幻海流最佳时机而烦恼吗&#xff1f;是否经常因为分…

作者头像 李华
网站建设 2026/8/1 21:50:21

如何在30天内完成Agent有效性验证?生物药研发加速的秘密武器

第一章&#xff1a;生物制药Agent有效性验证的挑战与机遇在生物制药领域&#xff0c;智能Agent正逐步应用于药物发现、靶点识别和临床试验模拟等关键环节。然而&#xff0c;这些Agent的有效性验证面临诸多挑战&#xff0c;同时也孕育着重大技术突破的机遇。数据异质性与标准化难…

作者头像 李华
网站建设 2026/8/1 19:58:37

为什么顶尖金融机构都在重构Agent审计日志?背后隐藏的4大合规趋势

第一章&#xff1a;金融合规 Agent 的审计日志在金融行业&#xff0c;系统操作的可追溯性是合规性的核心要求之一。审计日志作为记录系统行为的关键组件&#xff0c;为监管审查、异常检测和责任追溯提供了数据基础。金融合规 Agent 通过自动化手段收集、分析并归档关键操作事件…

作者头像 李华
网站建设 2026/8/1 1:56:27

58、Linux与Ubuntu:深入解析与使用指南

Linux与Ubuntu:深入解析与使用指南 1. mkinitrd工具介绍 mkinitrd工具会查看 /etc/fstab 、 /etc/modprobe.conf 和 /etc/raidtab 文件,以获取在启动过程中确定需要加载哪些模块所需的信息。在我们的系统中,使用以下命令: # mkinitrd initrd-2.6.7-1.img 2.6.7-1…

作者头像 李华
网站建设 2026/8/1 17:19:50

60、Ubuntu安装规划与硬件要求全解析

Ubuntu安装规划与硬件要求全解析 1. 选择Ubuntu的优势与安装关键因素 Ubuntu作为一种计算解决方案有诸多优势,由于其丰富的软件资源,它能在不同层级和硬件平台上扮演多种角色。为确保安装成功,需关注以下关键因素: - 准备工作 :充分讨论迁移或部署事宜,明确其带来的…

作者头像 李华