一、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. angular-cli 正确安装步骤

    npm install -g node-gyp npm install --global windows-build-tools npm install -g angular-cli

  2. hihoCoder 1233 : Boxes(盒子)

    hihoCoder #1233 : Boxes(盒子) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 There is a strange ...

  3. Xilinx_ISE 14.7 Win10 闪退

    打开D:\Xilinx\14.7\ISE_DS\ISE\lib\nt64 将libPortabilityNOSH.dll 重命名为libPortability.dll,替换原libPortabilit ...

  4. 5、iptables之nat

    iptables: 显式扩展.网络防火墙 显式扩展:multiport, iprange, string, time, connlimit, limit, state state:无关是哪种协议 /p ...

  5. 配置httpd支持https

    1.首先为192.168.108.159创建私有CA #cd /etc/pki/CA # (umask 077;openssl genrsa -out private/cakey.pem 2048) ...

  6. 转载]SAP囚徒 - 通过销售订单领用到成本中心,FI替代

    转载]SAP囚徒 - 通过销售订单领用到成本中心,FI替代   原文地址:SAP囚徒 - 通过销售订单领用到成本中心,FI替代实现不同成本中心记账科目不同作者:SAP囚徒 物品领用通常是库存管理的范畴 ...

  7. C#题目及答案(2)

    1. NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术. C#是一种编程语言,可以基于.NET平台的应用. 2.一列数的规则如下: 1.1.2.3. ...

  8. 简易Samba服务器配置

    Samba的作用是在Linux和windows之间通过网络进行资源共享.下面是简单的一个文件共享例子: 1.安装samba.samba-client服务 yum install samba samba ...

  9. 给 layui upload 带每个文件的进度条, .net 后台代码

    1.upload.js 扩展 功能利用ajax的xhr属性实现该功能修改过modules中的upload.js文件功能具体实现:在js文件中添加监听函数 //创建监听函数 var xhrOnProgr ...

  10. centos nginx 中安装ssl证书 以及在项目中的使用

    今天阿里云的证书到期了,重新申请了一个,下面是从申请到安装以及结合项目使用的过程: 1.登录阿里云   2.在左侧找到SSL证书 3.申请免费的证书 4.下载证书 5.根据说明配置nginx 6.在项 ...