引入
1、写程序时容易发生的一类错误 —— 传参过程中,数据结构发生了改变,但没有注意到。
所以就涉及到了可变对象 和 不可变对象 ,参数传递 是 传递值 还是 传递引用
2、Python 里所有的数据类型都是对象
值传递与引用传递:
值传递:就是拷贝参数自身所存储的值,将其传递给函数里的新变量 ,原变量和新变量之间 互不影响
引用传递:把参数自身的地址(引用)传递给新的变量, 新变量发生改变,将会引起原来变量的值一同改变
python中参数的传递:
python参数里存储的是另一个对象的引用,所以既不是值传递,也不是引用传递,而是赋值传递(pass by assignment),或者是叫对象的引用传递(pass by object reference)。用白话说就是,我把我存储的另外一个对象的引用,传递给你。
必须要注意的是:
python中赋值(或这说是对象的引用)传递,不是指向一个具体的内存地址,而是指向一个具体的对象。
如果对象是可变的,当其改变时,所有指向这个对象的变量都会改变。如果对象不可变,简单的赋值只能改变其中一个变量的值,其余变量则不受影响。
通过一个函数来改变某个变量的值,通常有两种方法:
直接将可变数据类型(比如列表,字典,集合)当作参数传入,直接在其上修改
在函数内另外创建一个新变量,保存修改后的值,然后通过return将其返回给原变量。这种方式更好一些,可以避免同时对同一资源的修改,避免静态条件引起的问题
创建一个新变量,来保存修改后的值,然后将其返回给原变量
如果对象是可变的,当其改变时,所有指向这个对象的变量都会改变
del 关键字:
del 只能删除一个变量,但是并不能删除任何对象(del引起的结果是,指向该对象的变量减少一个)