2.1.4 传递参数和返回值
下面将讨论Python语言中向函数传递参数和从函数返回值的特殊机制。虽然这些机制概念上十分简单,但有必要花时间透彻理解,因为其影响效果非常深远。理解参数传递和返回值的原理机制是学习任何一门新的程序设计语言的关键。在Python语言中,不可变性(immutability)和别名(aliasing)的概念扮演着重要的角色。
1. 通过对象引用实现调用
在函数体中的任何位置都可以使用形式参数变量,这和使用局部变量一样。形式参数变量和局部变量的唯一区别在于,Python使用调用代码传递对应的实际参数来初始化形式参数变量。我们称这种方法为“通过对象引用实现调用(call by object reference)”。(更常见的说法称之为“值调用”,这里的值通常为对象引用,而不是对象的值)这种调用的一种后果是,如果一个参数变量指向一个可变对象,在函数中又想改变该对象的值,则在调用代码中,该对象的值也被改变(因为二者指向同一个对象)。下面将探究这种方法的后果。
2. 不可变性和别名
如1.4节所述,数组是可变(mutable)数据类型,因为我们可以改变数组元素的值。相反地,一个数据类型是不可变的(immutable),是指该数据类型对象的值不可以被更改。前文学习的其他数据类型(int、float、str和bool)都是不可变的。对于不可变数据类型,有些操作表面上看起来修改了对象的值,但实际上创建了一个新的对象,一个简单例子如图2-1-7所示。
Get 程序设计导论:Python语言实践 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.