一、Python函数传参

在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么函数体内是无法直接修改传入的变量的。

假如我们把v=1传入函数体f(v1),实际就是新增了v1变量名,它和v同时指向1这个对象,如果我们在函数内部试图修改v1,由于整形是不可变的,实际上会创建一个新的对象,将v1指向新的对象,如果v指向的是可变对象,则内部对于其的修改会体现在外部上,这也是推荐tuple的原因之一。

另外,在python的局部作用域中,能够修改的对象必须是声明了的局部作用变量或者显示使用global声明的全局变量(其实使用nonlocal声明的自由变量也行),只要不修改值,单纯的读取的话,直接就可以读取全局变量,效果如下,尝试修改a时会报错,如果声明一下就可以避免:

二、C++中的函数传参

相比python,C++要灵活的太多,其参数传入有三种:

  1. 传入副本,最为广泛使用的方式,将参数值复制一份传入函数,函数的操作不影响原值
  2. 传入指针,实参使用地址,形参使用指针,可以在函数内部直接修改外部变量
  3. 传入引用,实参就是变量本身,形参需要加上&,此时不会拷贝出副本,而是将原数据直接传入,修改会直接体现在外部

下面程序是传入副本与传入指针的对比:

#include <iostream>
using namespace std;void myswap_pass_by_reference(int a, int b) {int t = a;a = b;b = t;
}void myswap_pass_by_pointer_value(int* a, int* b) {cout << *a << "  " << *b << endl;int t = *a;*a = *b;*b = t;cout << *a << "  " << *b << endl;
}int main() {int a = 1, b = 2;cout << "originally" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_reference(a, b);cout << "after myswap_pass_by_reference" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_pointer_value(&a, &b);cout << "after myswap_pass_by_pointer_value" << endl;cout << "a=" << a << ", b=" << b << endl;return 0;}

下面程序是传入引用和传入指针的对比:

#include <iostream>
using namespace std;void myswap_pass_by_reference(int& a, int& b) {int t = a;a = b;b = t;
}void myswap_pass_by_pointer_value(int* a, int* b) {cout << *a << "  " << *b << endl;int t = *a;*a = *b;*b = t;cout << *a << "  " << *b << endl;
}int main() {int a = 1, b = 2;cout << "originally" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_reference(a, b);cout << "after myswap_pass_by_reference" << endl;cout << "a=" << a << ", b=" << b << endl;myswap_pass_by_pointer_value(&a, &b);cout << "after myswap_pass_by_pointer_value" << endl;cout << "a=" << a << ", b=" << b << endl;return 0;}

可以看到,在调用了引用方式函数后,两个变量的值交换了次序。

『Python × C++』函数传参机制学习以及对比相关推荐

  1. python函数参数传递机制_Python 学习笔记(一) 理解Python的函数传参机制

    对于刚接触Python不久的新手,Python的函数传参机制往往会让人迷惑.学过C的同学都知道函数参数可以传值或者传地址.比如下面这段代码 点击(此处)折叠或打开 void func(int inpu ...

  2. 『Python基础』函数

    Python中的函数 函数 (1)什么是函数? 软件开发,是为了解决生活中的问题,函数就是生活中的一种行为,如:吃饭.睡觉.学习.游戏等等等- 不需要资源.不需要结果.执行即可 关门的行为 需要资源. ...

  3. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的

    python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...

  4. python函数传值还是地址_python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  5. Python基础day05【函数(函数传参的两种形式、函数形参)、拆包、引用、可变与不可变类型、引用做函数参数注意点】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员]    目录 0.复习 1.函数传参的两种形式[掌握] 2.函数形参 2.1.缺省参数(默认参数) ...

  6. python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)

    文章目录 高阶函数 函数传参 返回函数(闭包) 匿名函数lambda 高阶函数 定义: 至少满足下列一个条件: 接受一个或多个函数作为输入 输出一个函数 python里的高阶函数有 filter.ma ...

  7. assert函数_悉数Python函数传参的语法糖

    TIOBE排行榜是程序开发语言的流行使用程度的有效指标,对世界范围内开发语言的走势具有重要参考意义.随着数据挖掘.机器学习和人工智能相关概念的风行,Python一举收获2018年年度语言,这也是Pyt ...

  8. Python 函数传参详解

    Python位置传参 位置传参也称为必备参数,必须按照正确的顺序将参数传递到函数中,定义函数时的参数与实际传入的参数数量必须保持一致 正常如下: def par(A,B):return A+B pri ...

  9. PHP变量、引用、函数传参之彻底掌握,从此节操是路人

    2019独角兽企业重金招聘Python工程师标准>>> 今天绝对是兴奋的一天,不仅仅是周五这个特殊的日子(周六日可以休息啦),也不是弄清了某wordpress插件的功能流程,更不是再 ...

最新文章

  1. 微信公众平台JSSDK开发
  2. Liunx 系统调优
  3. 【漫画】AI小猪的一生---阿里云ET农业大脑如何与特驱集团养出“200公里猪”
  4. [转] Spring注解@Component、@Repository、@Service、@Controller区别
  5. 批处理处理oracle数据库脚本导入
  6. emacs在windowxp下的一些配置
  7. Spring5学习笔记——【遇见狂神说】[IoC、DI、AOP]
  8. Linux系列之Linux安装及源配置(软件源)的介绍
  9. 【天光学术】体育论文:乒乓球少年运动员专项身体素质训练探究(节选)
  10. graphviz linux教程,linux下做图工具——graphviz安装配置
  11. JDK1.8 新特性
  12. java万年历有农历_家庭农民历五行曰历,日历为什么叫“万年历”
  13. 快速学习四步法:如何用20小时,快速学习
  14. 光滑曲线_使用Python实现贝塞尔曲线连接多点形成光滑曲线
  15. 德莱联盟(判断两点是否相交 nyist)
  16. 【Android -- 技术周刊】第 006 期
  17. 下载keep运动软件_Keep下载_Keep苹果官方免费版APP下载[健身运动]-下载之家
  18. .net RPC框架选型(一)
  19. qma7981 源码 驱动_高品质PCB板配单报价,QMA7981-TR
  20. jsp简介及工作原理

热门文章

  1. boost::contract模块实现虚拟可选结果的测试程序
  2. Boost:等待和通知操作的模糊测试
  3. ITK:通过包装填充图像
  4. ITK:在傅立叶域中过滤图像
  5. C++返回一个数的二进制最右边的一位的实现算法(附完整源码)
  6. OpenGL Gamma校正 (Gamma Correction)
  7. C++实现complex number复数的算法(附完整源码)
  8. QT的QQuickImageProvider类的使用
  9. 经典C语言程序100例之五三
  10. C++11右值引用和移动构造函数