BEGIN:
此前,我一直以为python的参数传递只是值传递,直到面试的时候被问到这个问题,才发现,我一直坚守的“你以为就只是你以为”这个真理真的是一个真理,闲话不多说,进入正题。前面在介绍python的六大数据类型的时候提到根据数据可变和不可变进行的数据类型分类:
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
python
中的函数参数既支持按值调用,也支持按引用调用。这里需要再次强调:python中万物皆对象,python中的变量是对象的引用,变量中存储的是内存地址。当函数被调用时,解释器会查看传入的变量(内存地址)指的那个指的类型,如果是一个可变类型
的值,就按照引用传递变量;如果是一个非可变类型
的值,就考虑按照值传递变量。
对于不可变数据类型(数字、字符串、元组),函数对变量的任何修改都是函数私有的,不会反映到函数外面,由于这些变量是不可变的,所以不能修改,如:
对于可变数据类型(列表、字典、集合),传入函数中的变量,函数内部的修改都会反映到函数外面,即最初始的变量会受到影响,毕竟这些初始的变量是可变类型,如:
例外:
这里,对于可变数据类型,传入参数并没有改变函数外面的值,原因在于语句:a = a+[‘a‘,‘b‘,‘c‘]
首先,传入的变量,先执行a+[‘a‘,‘b‘,‘c‘],所产生的新的变量(新对象的引用),重新赋值给原先的变量a
,覆盖其原先的引用,导致原先的变量a
与外面初始变量之间的联系断了,这时候,a变量对应的对象引用已经和原先的对象引用不同了,那么函数里面的a
的改变就和原先的变量没有关系了,所以并不能影响到函数外面的变量
END.
原文:https://www.cnblogs.com/gangpei/p/13963123.html