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

对于刚接触Python不久的新手,Python的函数传参机制往往会让人迷惑。学过C的同学都知道函数参数可以传值或者传地址。比如下面这段代码

点击(此处)折叠或打开

void func(int input) {

input = 100;

}

int a = 0;

func(a);

printf("%d", a);

结果应该是打印0,a的值自始至终都没有改变,因为传递给函数func的是a变量的一个拷贝。而下面这段代码,

点击(此处)折叠或打开

void func(int* input) {

*input = 100;

}

int a = 0;

func(&a);

printf("%d", a);

则会打印100,因为传递给func的参数是变量a的地址。

那么Python遇到类似情况是怎么样处理的呢?以下摘自Mark Lutz的Learning Python第五版,

Python’s pass-by-assignment scheme isn’t quite the same as C++’s reference parameters

option, but it turns out to be very similar to the argument-passing model of the C

language (and others) in practice:

Immutable arguments are effectively passed “by value.”Objects such as integers

and strings are passed by object reference instead of by copying, but because

you can’t change immutable objects in place anyhow, the effect is much like making

a copy.

Mutable arguments are effectively passed “by pointer.”Objects such as lists

and dictionaries are also passed by object reference, which is similar to the way C

passes arrays as pointers—mutable objects can be changed in place in the function,

much like C arrays.

Of course, if you’ve never used C, Python’s argument-passing mode will seem simpler

still—it involves just the assignment of objects to names, and it works the same whether

the objects are mutable or not.

也就是说在Python中,不可变参数(Immutable arguments)都是可理解为传值的,而可变参数(Mutable arguments)都是可以理解为传地址的。而哪些类型是不可变参数呢,根据Mark的描述,numbers,strings,tuples都属于不可变,而list,dict都属于可变类型。看下面这段小程序,

点击(此处)折叠或打开

def func(var1):

var1 = 10

var2 = 200

func(var2)

print var2

func的传入参数是整数,值为200,在func内部,它试图把传入参数赋值为10,结果打印出来的值仍然是200,原因是func的参数是不可变类型。

再看下面这段程序,

点击(此处)折叠或打开

def func(var1):

var1[0] = 100

var2 = [3,4,5,6,7]

func(var2)

print var2[0]

func的传入参数是list,属于可变类型,而函数试图把这个list的第一个元素用100进行赋值,结果是var2的第一元素从3变为了100,最终打印出来的结果是100。

在实际工作中,如何保证参数在传递过程中不发生改变呢?一个办法是传递参数的一份拷贝,比如需要传一个列表L = [1,2,3]给函数func,那你可以写成func(L[:])。另一个办法是使用函数tuple,把list转换为tuple,像这样func(tuple(L))。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页无法调用java9_JAVA 9 (内部类,异常,包)

内部类:将一个类定义在另一个类里面,称里面那个类为内部类。举例:class Zx{public static void main(String []arr){Outer o new Outer();o.method();}}class Outer{class Inner //内部类,可以定义多个内部类{void function(){S…

python renamer模块_Python - 批量文件重命名

两个目标两个:1. 输入一组文件名,进行批量重命名;2. 输入一组目录名,批量重命名各个目录下的文件。附加功能:1. 可根据文件的创建日期对文件重新排序;2. 重命名方式为递增数列,可带前后缀&#…

spark算子_Spark篇之持久化算子

一、前述Spark中控制算子也是懒执行的,需要Action算子触发才能执行,主要是为了对数据进行缓存。控制算子有三种,cache,persist,checkpoint,以上算子都可以将RDD持久化,持久化的单位是partition。cache和persist都是懒执…

java g1 gc ref proc_深入理解垃圾收集器的G1及日志分析

尽管Hotspot 最新的垃圾回收器G1是在2006年推出的。但是G1从推行至今的市场反响来看,但现在足以证明这款垃圾收集器是经得起考验的,从java9开始,就默认为G1垃圾收集器。G1是一款面向服务端应用的垃圾收集器。HotSpot开发团队赋予它的使命是(在…

python爬取哔哩哔哩视频_Python实现视频爬取下载

注:源内容来自公众号【python学习开发】一般情况下我们使用爬虫更多的是对数据或者图片进行爬取,今天在这里和大家分享一下关于使用爬虫技术来进行视频下载的方法,不仅可以方便的下载一些体积小的视频,针对大容量的视频下载同样试用。接下来我们来介绍此次爬取视频过…

java约瑟夫环pta上_cdoj525-猴子选大王 (约瑟夫环)

约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下.(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,…,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴…

java++记录+运行_记录java+testng运行selenium(三)---xml、ini、excel、日志等配置

一: ini文件ini目前只用处存储浏览类型及需要打开的url,ini文件放在configs文件夹下面。读取ini代码如下:1 packagetoolskit.documents;23 import java.io.*;4 import java.util.*;56 /**7 * ClassName: ReadIni8 * Author: DingDong9 * D…

python字符串前面加f什么意思_Python 字符串前面加u,r,b,f的含义

1、字符串前加 u例:u"我是含有中文字符组成的字符串。"作用:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。2、字符串前加 r例&#xff1a…

mysql居左查询abcd_MySql速查手册

索引定义索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B树的形式保存。就像是数据的目录。索引类型唯一索引主键索引B-Tree普通索引R-Tree联合索引Hash全文索引FullText在mysql中fulltext索引只针对myisam生效。符合索引对于创建的多列索引(复合索引)&…

和python哪个容易胖_为什么有些人特别容易胖?

7种人,最容易被肥胖盯上,其中有你吗?胖,总是来得猝不及防,肥肉也总是不知不觉地长出来……许多胖友对自己的身材老摸不着脑,其实,长胖都是有迹可循的!正如下面这7类人,就…

loadrunner 错误: 无法找到 java.exe_LoadRunner错误及解决方法总结

1. error:missing newline in d:\loadrunner\name.dat场景执行时报error:missing newline in d:\loadrunner\name.dat第二次执行不报两个解决办法:第一:如果参数不是很多的话,不要打开记事本去编辑参数,就直接在LR提供的参数的表格…

gif透明背景动画_【超实用干货! 】iPad上的动画App大推荐

作者/立夏编辑/彼方大家好,我是立夏。大概在两年前吧我为大家写过几款动画APP的评测,这一次我也想给大家推荐一些我的新宠,供大家参考。我在这里就不过多提及如Animation Desk、Procreate或是Callipeg之类知名度相对更高一些的动画App了&…

python框架是干什么的_django框架是干什么的

django(Python Web 框架)Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。…

iphone如何信任软件_【手机软件】千禾影院:全新观影神器,支持安卓+iOS,最新、最全、高清、免费!...

Hello,大家好,我是春哥!每天记得打卡哦!感谢每一位小伙伴们的关注和支持!免责声明大部分资源来源于网络,仅供学习和交流使用,如有侵权请联系我们删除。每期文章末尾都会有关键词,在公众号发消息…

Java小魔女芭芭拉_沉迷蘑菇不可自拔,黏土人《小魔女学园》苏西·曼芭芭拉 图赏...

GOOD SMILE出品的黏土人系列手办新作——《小魔女学园》苏西曼芭芭拉,已经开始接受预定了。这款黏土人的原型师是来自中国上海的陈天,售价4167日元,预计2018年4月发售。苏西是主人公亚可的室友,她是从东南亚来的身份不明的魔女。热…

java int相除向上取整_java实战项目常用类,Date、Calendar、BigDecimal、Math、UUID

Java开发中经常用到的类和方法,以下主要就日期是时间处理、金融数字处理、数学计算、随机数、MD5加密等。java.util.Date类java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。日期时间的本质是一个long,它…

python四级中考有用的_一位中考生家长的后悔药:考前30多天,千万别做这7件傻事...

中考即将来临,考后必定是几家欢乐几家愁,有庆幸的、有后悔的。中考前的几个月到底应该怎么过?考前考中需要注意什么?家长做哪些事情是画蛇添足的。今天给大家推荐一位“中考失败”学子父亲的自白,其中有对优秀儿子的心疼&#xf…

R语言中dim函数_R语言--向量化计算(apply族函数)

R语言最优秀的是它的向量化编程,这其中apply族函数扮演了非常重要的角色。apply族函数是由apply、sapply、lapply、mapply、tapply等函数组成的。熟练使用apply族函数,能够简化程序,提高代码的运算速度。软件&环境win10 64bitR 3.6.1appl…

php+mysql记事本_一个简单记事本php操作mysql辅助类创建

//SqlHelper.class.phpconnmysql_connect($this->host,$this->user,$this->passwrd); if(!$this->conn){ die("连接失败".mysql_error()); } mysql_select_db($this->db); mysql_query("set names utf8"); } //增删改 function execute_dml…

python init方法做了什么_Python类方法、__new__方法和__init__方法分别是什么

Python类方法、__new__方法和__init__方法分别是什么发布时间:2020-09-03 15:24:06来源:亿速云阅读:104作者:小新这篇文章主要介绍Python类方法、__new__方法和__init__方法分别是什么,文中介绍的非常详细,…