python函数在传参的时候,到底在传些什么?

C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办?
比如我们想要传一个x到函数中做个运算改变x的值:

def change(y):y += 1x = 1
print ("before change:", x)
change(x)
print ("after change: ", x)

得到的结果是

before change: 1
after change:  1

完全没用~~~这是怎么回事?
我来说明一下这个过程~

参数传递

也就是说python中的等号就是把变量指向了一个实例而已。
那么,如何做到其它语言中引用这样的效果呢?一个比较推荐的方法就是用把参数return回去就可以了,如下面代码所示。

def change(y):y += 1return yx = 1
print ("before change:", x)
x = change(x)
print ("after change: ", x)

结果为

before change: 1
after change:  2

另一种方法就是,我们不让函数中的参数指向新的地址不就可以了,我们让它在原来的地址上修改我们的值。这一点,只有一部分的数据类型可以做到,我们把这样的对象叫做可变对象,做不到的就叫不可变对象。

  • 不可变对象:int,string,float,tuple 等
  • 可变对象 :list,dictionary 等

举几个例子更为通俗易懂

def change(x):print ("before append:", x, "id:", id(x))x.append(0)print ("after append:", x, "id:", id(x))x = [1, 2, 3]
print ("before change:", x, "id:", id(x))
change(x)
print ("after change:", x, "id:", id(x))
before change: [1, 2, 3] id: 140623459512008
before append: [1, 2, 3] id: 140623459512008
after append: [1, 2, 3, 0] id: 140623459512008
after change: [1, 2, 3, 0] id: 140623459512008

由于list在做append操作时,x指向的地址是不变的,所以可以有引用的效果,x[0] = 4这样的操作也是没问题的
然而,如果是把x指向了新的地址就不行了,如下

def change(x):print ("before equal:", x, "id:", id(x))x = [5]print ("after equal:", x, "id:", id(x))x = [1, 2, 3]
print ("before change:", x, "id:", id(x))
change(x)
print ("after change:", x, "id:", id(x))
before change: [1, 2, 3] id: 139683058095432
before equal: [1, 2, 3] id: 139683058095432
after equal: [5] id: 139683058028360
after change: [1, 2, 3] id: 139683058095432

这下应该就搞清楚是怎么回事了吧,不过正是因为python的这种特性,在函数设置默认参数的时候,我们要注意尽量不用可变对象当默认值,否则会发生下面这种情况

def change(x=[]):x.append(1)return xprint (change())
print (change())
[1]
[1, 1]

比较妥当的做法是用不可变对象来代替[],比如None

def change(x=None):if not x:x = []x.append(1)return xprint (change())
print (change())

此时的输出为

[1]
[1]

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

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

相关文章

android学习笔记五。2、其他组件

一、ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的 1、使用: 在应用中使用ContentProvider提供的数据并不是直接使用的,而是需要通过ContentResolver来实现的,ContentRes…

一维条形码识别c语言_条形码的优点

条形码是迄今为止最经济、实用的一种自动识别技术。条形码技术具有以下几个方面的优点A.输入速度快:与键盘输入相比,条形码输入的速度是键盘输入的5倍,并且能实现“即时数据输入”。B.可靠性高:键盘 输入数…

气象数据领航无人飞行器线路优化大赛解决方案(3rd place)

1 队伍介绍 队伍名称:酒后写诗 队伍成员:陈权、林望黎、黄章炜 队伍名次:3 / 1646 2 问题简介 这个问题说起来其实挺简单(但实现起来困难重重),就是提供了气象局得到的10个模型的预测数据(…

mac最好用的markdown_「建议收藏」PCMaclinux,最好用Markdown编辑器清单

文章很长,不想看,请直接拉到底看简略版清单!!如果您曾经用Word写过文章,并尝试将文本移动到CMS中(头条、百家号等),那么您可能已经花费了大量时间,来调整这种跨平台转换导致的格式杂乱。因此&am…

Nodejs 操作 MongoDb 数据库

一、在 Nodejs 中使用 Mongodb 在前面的博文我们给大家讲了如何使用命令操作 Mongodb,这篇博文开始我们给大家讲解一 下如何使用 Nodejs 来操作 Mongodb 数据库 Nodejs 操作 mongodb 数据库官方文档:https://www.mongodb.org.cn/drivers/5.html npm i…

机智的ensemble

1 引言 本文主要结合了李宏毅的机器学习课程之Ensemble和周志华的《机器学习》西瓜书两者的说法,对ensemble这一竞赛利器做了总结。 Ensemble主要可以分为bagging和boosting两种方法。其中,bagging适用于基模型复杂度比较高的情况(如树模型…

Linux的sort命令

Linux的sort命令 Linux的sort命令就是一种对文件排序的工具,sort命令的功能十分强大,是Shell脚本编程时常使用的文件排序工具。 sort命令将输入文件看做由多条记录组成的数据流,而记录由可变宽度的字符串组成,以换行符作为定界符。…

delphi 调用php接口_爱站权重查询 API 接口请求调用

爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用。支持前台跨域请求,以GET/POST方式提交即可。爱站权重查询 API 接口可以查询百度权重、搜狗等级、360权重、神马权重、谷歌等级等,你可以选择调用本站的接口,也可以利用本…

Express 路由、Ejs 、静态文件托管、中间件

一、 Express 简单介绍 Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架,它提供一系 列强大的特性,帮助你创建各种 Web 和移动设备应用。 Express 官网: 英语官网:http://expressjs.com/中文官网…

相邻位数字差值的绝对值不能超过_热点争议中技术问题,伺服控制有几个零点?对应真绝对值多圈编码器意义...

回归技术,把技术问题单独挑出来讲透,争要争个明白,看要看得明白。技术就能越辩越明。如果有“真”与“假”之争,沉默不去争,就是让“真的”受伤,让真心实干的人受伤。伺服控制有三个零点,对应三…

Chapter1-1_Speech_Recognition(Overview)

文章目录1 古人看语音辨识2 什么是语音辨识2.1 输出部分 - Token2.2 输入部分 - 声音信号特征3 数据集4 模型本文为李弘毅老师【Speech Recognition - Overview】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自…

[Swift]loadNibNamed方法

我们自定义UITableViewCell的时候,经常会创建一个xib文件。 (注意:选择创建文件要继承于cocoa touch class,而不是cocoa class,否则你是选不了创建xib的!!!) 然后我们可以…

Express Cookie 的基本使用

一、Cookie 简介 ● cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域 名的时候共享数据。 ● HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个…

Chapter1-2_Speech_Recognition(LAS)

文章目录1 内容简述2 模型详述2.1 ListenRNN Encoder1D-CNN EncoderSelf-attentinon EncoderDown Sampling2.2 Attend2.3 Spell2.4 Beam Search2.5 Training2.6 Back to Attention本文为李弘毅老师【Speech Recognition - Listen, Attend, Spell】的课程笔记,课程视…

智能车的转弯部分_江西智能搬运平板车铁路轨道运输车-厂家直销

本公司致力发展搬运设备,从公司成立至今一直在做电动平车的研发,从几十千克自动化物流车到成百上千吨都能自行研发制造,取得了优异的业内好评和广大消费者的肯定! BWP型无轨平板车是一种使用特殊的行走机构,能够在较小…

Express Session 的基本使用

一、 Session 简单介绍 session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。 Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上。Session 相比 Cookie 要 更安全一些。由于 Ses…

Chapter1-3_Speech_Recognition(CTC, RNN-T and more)

文章目录1 CTC2 RNN-T3 Neural Transducer4 Monotonic Chunkwise Attention5 小结本文为李弘毅老师【Speech Recognition - CTC, RNN-T and more】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。 下文中用到的图片均来自于李宏毅老师的…

java商城_基于Java,jfinal web框架开发出微信商城,微信分销商城源码分享

项目简介:专门针对微信服务号开发的一套微信商城,微信分销商城,支持商品多规格,支持按地区设置邮费,支持限时打折,订单返现,满减送,满包邮,支持订单打印,订单…

Express 路由模块化以及 Express 应用程序生成器

一、 Express 路由模块化 https://expressjs.com/en/guide/routing.html Express 中允许我们通过 express.Router 创建模块化的、可挂载的路由处理程序。 1、新建一个 user.js 配置如下代码 var express require(express) var router express.Router() router.get(/, fun…

qscrollarea 设置滚动位置_爱剪辑:影视剧滚动字幕片尾,效果竟然如此高端精美...

大家好今天教大家制作滚动字幕片尾这种效果经常在影视剧和自媒体中看到不仅好看精美,而且还高大上快来学习吧~视频教程:爱剪辑:影视剧滚动字幕片尾教程https://www.zhihu.com/video/1174030334688632832移动视频的位置导入视频后&…