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

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

       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对象都是可变对象。(这句是笔者本身加的,老师傅对该句正误不负责)学习