python中的参数传递
BEGIN:
前面在介绍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
的改变就和原先的变量没有关系了,所以并不能影响到函数外面的变量。
也许这样看会明白一些:
函数里面的变量a+['a','b','c']实际上是[1,2,3,'a','b','c']这个值,而a=a+['a','b','c']等价于a=[1,2,3,'a','b','c'],由于[1,2,3]对应的内存地址和[1,2,3,'a','b','c']对应的内存地址不是同一个,对于函数里面的变量a,内存会重新开辟一个空间作为变量a的内存地址,相当于一个新的变量,因此这里函数里面的a后续无论如何改变都不会影响到外面的那个变量a的值。
END.