一、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中给函数传参是传值还是传引用

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

  2. python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块

    ---恢复内容开始--- 一.函数相关: 1.1位置参数: ef hello(name,sex,county='china'): pass #hello('hh','nv') #位置参数.默认参数 1 ...

  3. python引用在函数传参时的体现以及可变与不可变对象的对比

    今天偶然看到 vamei 老师的博客 http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html 讲的是python动态类型以及引用的事儿 ...

  4. Python基础数据类型-函数传参详解

    Python基础数据类型-函数传参详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位置参数 #!/usr/bin/env python #_*_coding:utf-8_* ...

  5. python函数传参是传值还是传引用?

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

  6. 函数传参传的是啥的思考【java Python】

    今天看<java 核心 卷1>的时候,作者提到了函数传参的问题,他提到,java传参,传的是值,而不是引用,然后,函数将要传的实参的值(如果实参是基本数据类型,那么就是值.如果实参是对象, ...

  7. Java函数的传参机制

    一 最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了. 我就打算好好理一理java的传参机制,整理一番 二 很多人一听Java的传参,那一定会脱口而出,java ...

  8. 悉数 Python 函数传参的语法糖

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

  9. python函数传参和返回值注意事项

    函数传参 空参数 定义函数时括号里面没有形参,调用时不用传参. def func(): print('null para.') # 调用 func() 位置传参 规定形参的数量,调用时必须传递相同数量 ...

随机推荐

  1. 安装ubuntu的坑&RHEL7配置

    1.需要其他设置->分区,分区需要有/根目录分区和swap空间,后者文件系统类型选择swap,其他都是ext4 2.普通配置电脑,安装16.04.5 LTS,不要安装最新的,安装重启后卡在那里, ...

  2. Oracle联合多个子查询(inner join)

    select aaa.*,bbb.xh from (select xn,xq,kcdm,kcmc,xf,xkkh,kcxz from jxrwbview where xn='2017-2018' gr ...

  3. ASP.NET Core2.1 中如何使用 Cookie和Session

    https://blog.csdn.net/canduecho/article/details/80651853 ASP.NET Core2.1的官方项目模板在创建的Razor Pages和MVC项目 ...

  4. P4720 【模板】扩展卢卡斯

    思路 扩展Lucas和Lucas定理其实没什么关系 我们要求的是这样的一个问题 \[ \left(\begin{matrix}n\\m\end{matrix}\right) mod\ P \] p不一 ...

  5. [mybatis错误] - sql出错 org.apache.ibatis.ognl.ParseException: Encountered "!" at line 1, column 15. Was expecting one of:

    完整异常:Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'developerTy ...

  6. postgreSql——时区问题

    timestamptz.timestamp SELECT ts AT TIME ZONE 'UTC' FROM ( VALUES (timestamptz '2012-03-05 17:00:00+0 ...

  7. Python-ConfigParser获取配置项名称大小写问题

    C:\Python27\Lib\ConfigParser.py: def optionxform(self, optionstr): return optionstr.lower() 会将配置文件中的 ...

  8. 使用Scapy向Mininet交换机注入流量 实验记录

    使用Scapy向Mininet交换机注入流量 实验记录 用Python脚本及Scapy库写了一个简单的流量生成脚本,并打算使用该脚本往Mininet中的OpenvSwitch交换机注入流量.拓扑图如下 ...

  9. python学习 day10打卡 函数的进阶

    本节主要内容: 1.函数参数--动态参数 2.名称空间,局部名称空间,全局名称空间,作用域,加载顺序. 3.函数的嵌套 4.gloabal,nonlocal关键字 一.函数参数--动态传参 形参的第三 ...

  10. linux 基础命令(12月25日笔记)

    1.  cp指令指令:cp          (copy,复制)作用:复制文件/文件夹到指定的位置语法:#cp [-r] 被复制的文档路径 文档被复制到的路径选项:         -r:recurs ...