
上QQ阅读APP看书,第一时间看更新
4.1.2 函数的值传递和引用传递

4.1.2 函数的值传递和引用传递
一般情况下,在调用函数时,调用函数与定义函数之间有数据传递,即将调用函数的实参传递给定义函数,完成实参与形参的结合,然后执行函数调用。
Python中,函数参数由实参传递给形参的过程是由参数传递机制来控制的。根据实参的类型不同,函数参数的传递方式分为两种:值传递和引用传递(又称为地址传递)。
1.函数参数的值传递
如果实参的数据类型是不可变类型(字符串、数值、元组),则函数参数的传递方式将采用值传递方式。
值传递就是将实参值的副本传入函数,不管在函数中如何对这个副本改变,实参值本身不会受到任何影响。
【例4-7】 编写一个程序,分别传递一个数值和一个字符串,在函数中更改它们的值。

运行结果如下:

从程序运行结果看,即使函数中的变量名与主程序中的变量名相同,由于开始执行函数时对形参执行初始化,就是把实参变量的值赋给函数的形参变量,在函数中操作的并不是实际的实参变量。所以,在执行函数时即使其变量内容发生变化,主程序中的变量值并不会随之改变,这就是值传递的实质。
2.函数参数的引用传递
如果实参的数据类型是可变对象(列表、字典),则函数参数的传递方式将采用引用传递方式。函数参数引用传递后,如果改变形参的值,则实参的值也会一同改变。
【例4-8】 编写一个程序,分别传递一个数值和一个列表,在函数中更改它们的值。

运行结果如下:

从程序运行结果看,a的数据类型是数值(值传递),因此在函数中更改其值不会改变主程序中a的值。也就是说,虽然变量名都是a,但是函数内外是不同的a。b是一个列表(引用传递),因此在函数中更改其值会改变主程序中b的值。