python函数的可变对象参数和不可变对象参数

       本文是老师傅在我之前一篇错漏百出的博客上的留言内容,笔者将其留言内容贴出供笔者和大家学习。欢迎关注老师傅博客https://me.csdn.net/leekuangyu,虽然大神什么也没有写。  

       python的任何传参都是以引用进行的。 首先说说mutable和immutable对象。非可变对象仅仅是无法对其本身作出改变。所有built-in的简单类型(int,float,str,bytes,unicode等)都是非可变,复合对象中元组tuple,frozen对象(frozenset,frozendict等)为非可变。类定义(类型为type的对象)也是不可变的。特别地,set是可变的。简单对象指的是对象不能存储其他对象的引用,与复合对象相对。注意非可变指的是对象本身,如果这个对象存储了指向其他对象的引用,则该引用遵循其自身的规则(比如tuple里存储了一个list,元组的不可变性不能阻止那个list里的内容被修改)。要注意用户自定义的类,类实例为可变对象但“类”本身属于非可变对象(类本身也是对象,是type类的实例)。有一个方便但不100%保险的辨别方法:非可变对象拥有默认的__hash__()方法且可以被直接用作字典的key或丢进set里。 下面来说说传参。我的经验集中在Cpython3.6-3.7,对于之前和之后的版本,或者是其他python的实现则未必适用。python的CAPI指明的函数主要有两种调用约定: PyObject* func( PyObject* self, PyObject* varg); PyObject* func( PyObject* self, PyObject* varg, PyObject* kwarg); 也就是说,所有参数传入python的函数之前都会被封装成两个对象:一个元组+一个字典;在调用函数内部,再解析出原本的对象。因为元组和字典都只存储引用,因此传参毫无疑问是引用,不存在复制对象的情况。存在第三种fastcall的调用约定直接传入参数对象指针,因此也是属于传引用而非传值。

       此外,还有pandas中的DataFrame对象以及numpy的ndarray对象都是可变对象。(这句是笔者自己加的,老师傅对该句正误不负责)

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值