位置: 编程技术 - 正文

python黑魔法之参数传递(python黑魔法手册)

编辑:rootadmin

推荐整理分享python黑魔法之参数传递(python黑魔法手册),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python黑魔法手册 pdf,python中的魔法函数,python魔法方法str,python魔法参数,python黑魔法手册 pdf,python 黑魔法,python魔法参数,python 黑魔法,内容如对您有帮助,希望把文章链接给更多的朋友!

我们都听说,python世界里面,万物皆对象。怎么说万物皆对象呢?最常见的:

我们说a是一个对象。那么既然是万物了,其实A也是对象。3 也是对象。True 也是对象。"hello" 也是对象。> def Func(): pass o~yee, Func 也是对象。那么对象之间的传递是如何呢?我们看看下面两个简单的例子:

不是都说python所有对象都是引用传递吗?为毛第一个b不是3?好吧。事实是,在python的实现上,对象分为mutable 和 immutable。这里说的对象分类,是说在实现上具备这样的特性。而非对象本身的属性。什么是immutable?表示对象本身不可改变。这里先记住一点,是对象 本身 不可改变。什么叫做对象本身不可改变呢?一个简单的例子:

TypeError: 'tuple' object does not support item assignment元组的元素在初始化后就不能再被改变。也就是说,元组对象具备immutable的特性。那么很简单,相对的,mutable 就是可变的。比如:

有了上面的两个例子,相信大家已经有了基本的认识。那么,在python世界中,哪些是具备immutable特性,哪些又是mutable的呢?简单讲,基本类型都是immutable, 而object都是mutable的。比如说:int, float, bool, tuple 都是immutable。再比如:dict, set, list, classinstance 都是mutable的。那么问题来了。既然说基本类型是 immutable ,那么最上面的 b = 3 + 1 为什么不会像tuple一样,抛异常呢?原因在于,int 对+操作会执行自己的__add__方法。而__add__方法会返回一个新的对象。事实是,当基本类型被改变时,并不是改变其自身,而是创建了一个新的对象。最终返回的是新的对象的引用。怎么证明?我们可以使用一个叫做id()的函数。该函数会返回对象的一个唯一id(目前的实现可以间接理解为对象的内存地址)。那么我们看下:

you see &#; 当我们执行a=a+1 后,id(a) 已经改变了。深究一点,为什么会这样呢?其实,a = a + 1 经历了两个过程:

1、a + 1 2、a 赋值

第2步只是一个引用的改变。重点在第1步。a + 1,那么python实际上会调用a.__add__(1)。对于int类型__add__函数的实现逻辑,是创建了一个新的int对象,并返回。不知道细心的你有没有发现一个特别的地方?id(4)的值等于id(3+1) 。这个只是python对int,和bool做的特殊优化。不要以为其他基本类型只要值一样都会指向相同的对象。有个特殊的例子,str。做个简单的实验:

python黑魔法之参数传递(python黑魔法手册)

看到了吗?虽然值相同,但是还是指向(创建)了不同的对象,尤其是最后两句,哪怕执行相同的操作,依然创建了不同的对象。python这么傻,每次都创建新的对象?no no no 他只是缓存了“一些”结果。我们可以再试试看:

看到了吗?python还是挺聪明的。不过具体的缓存机制我没有深究过,期望有同学能分享下。再次回到我们的主题,python中参数是如何传递的?答案是,引用传递。平时使用静态语言的同学(比如我),可能会用下面的例子挑战我了:

不是尼玛引用传递吗?为毛在执行func(a)后,a 的值没有改变呢?这里犯了一个动态语言基本的错误。data=3,语义上是动态语言的赋值语句。千万不要和C++之类的语言一个理解。看看我们传入一个mutable 的对象:

现在同学们知道该如何进行参数传递了吧?好嘞,进阶!像很多语言如C++,js,swift... 一样,python 的函数声明支持默认参数:def func(a=[]): pass不知道什么意思?自己看书去!我这里要说的是,如果我们的默认参数是mutable类型的对象,会有什么黑魔法产产生?我们看看下面的函数:

可能有同学会说了:我去!这么简单?来骗代码的吧?但是,真的这么简单吗?我们看下下面的调用结果:

这真的是你想要的结果吗?No,我要的是[3],[3],[3]!原因?好吧,我们再用下id()神奇看看:

明白没?原来在python中,*默认参数不是每次执行时都创建的!*这下你再想想,曾经嘲笑过的代码(至少我)为什么要 多此一举:

这里在顺带提一下==, is:== : 值比较is : 比较左右两边是否是同一个对象。 a is b ==> id(a) == id(b)ok, let's move on!我们都知道,在python中,不定参数我们可以这样定义:def func(*args, **kv): pass什么你不知道?看书去!那args和kv到底是什么情况呢?到底是mutable 还是 immutable 呢?再一次请出id()神器:

看到了吧?实际上args也会产生一个新的对象。但是值是填入的传入参数。那么每一个item也会复制吗?我们再看看:

答案是,No。值会像普通list赋值一样,指向原先list(a)所引用的对象。那么为什么会这样呢?python的源码就是这么写的.......最最后,还记得我说过的一句话吗?immutable 限制的是对象本身不可变意思就是说,对象的immtable 只是限制自身的属性能否被改变,而不会影响到其引用的对象。看下下面的例子:

最最最后,我有个对象,它本身应该是 mutable 的,但是我想让他具备类似immutable的特性,可以吗?答案是,可以模拟!还是之前说的,immutable 限制的是其自身属性不能改变。那么,我们的可以通过重定义(重载)属性改变函数,来模拟immutable特性。python可以吗?O~Yee在python的类函数中,有这样的两个函数: __setattr__ 和 __delattr__。分别会在对象属性赋值和删除时执行。那么我们可以进行简单重载来模拟immutable:

标签: python黑魔法手册

本文链接地址:https://www.jiuchutong.com/biancheng/382338.html 转载请保留说明!

上一篇:python实现井字棋游戏(python井字游戏)

下一篇:常用python编程模板汇总(常用python编程软件)

  • 民间非盈利组织会计中所拥有的用于
  • 每月进项税额怎么算
  • 城市维护建设税优惠政策
  • 外购入库暂估补差单怎么去除
  • 想要自己开厂应该怎么做
  • 季报申报之后还可以改吗?
  • 一般纳税企业可以变更小微企业吗
  • 生产型增值税转变为消费型增值税
  • 离婚财产分割涉及偷税漏税可以移交税务局调查吗
  • 库存现金日记账和库存现金总账都应逐日逐笔
  • 下个月的发票可以报销上个月的费用吗
  • 应付职工薪酬的账务处理
  • 关于旅行社代订的通知
  • 卷帘机适用税率
  • 广告服务增值税差额征税
  • 万元的票可以开到多大金额
  • 年金的缴费基数
  • 转出多交增值税会计科目
  • 企业集团内部各所属单位之间
  • 进项发票认证抵扣会计分录
  • 资金池利息收入计入投资收益吗
  • 企业房租收入如何申报
  • 住房公积金相关文件
  • 偶然所得是什么科目
  • 固定资产清理和固定资产减值准备的区别
  • wmpdmc.exe是什么意思
  • 增值税出口服务包括什么
  • 域名怎么交费
  • php 二叉树的遍历
  • 金融行业如何征收营业税
  • 资产证券化会计信息披露规范
  • 出差补贴怎么记账
  • 经营租入的固定资产是什么意思
  • 期末库存盘点表
  • 出口货物的出口日期以
  • php获取url内容
  • 材料成本差异属于流动资产吗
  • 国税一证通
  • php正则表达式验证网址
  • 期末余额跟年初余额是什么意思
  • 损益类科目调整影响所得税吗为什么
  • 字节在互联网什么地位
  • php 密码加密
  • iotop命令 监视磁盘I/O状态
  • 一般情况下公司为什么会吊销
  • 报税系统清卡成功状态
  • python怎么做gui
  • 季末资产总额怎么计算出来的
  • 织梦标签工具
  • SQLServer中Partition By及row_number 函数使用详解
  • 企业三季报
  • 物流公司驾驶员工资计算方式
  • 企业应付账款科目的借方余额反映的是
  • 制造费用分配后总账月末余额在哪方?
  • access untagged
  • mysql服务器硬件配置
  • 没有以前年度损益科目应该加在什么地方
  • 已纳消费税扣除会计分录
  • 小微企业免税销售额和其他免税销售额的区别
  • 租赁房屋怎么做账
  • 借管理费用贷应交税费个人所得税
  • 购入固定资产会计处理
  • 客户赔款会计科目
  • 向投资者分配利润或股利为什么减少所有者权益?
  • 固定资产多少钱入账
  • mysql获取当前行数
  • mac安装mysql没看见初期密码
  • centos7.0镜像下载
  • 配置结果
  • ghost后恢复
  • ie10和ie11
  • ubuntu sudo apt
  • ubuntu with linux
  • win7修改用户密码命令
  • 四步制作的花
  • 30岁亿万富婆
  • javascript数组操作方法
  • jQuery中使用animate自定义动画的方法
  • 物业公司收取物业费要交税吗
  • 经济增长的术语
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设