第 18 章 争论 论据
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
第 17 章探讨了 Python作用域背后的细节--变量定义和查找的位置。正如我们所学到的,在代码中定义名称的位置决定了它的大部分含义。本章通过研究 Python参数传递的概念--将对象作为输入发送给函数的方式--继续讲述函数的故事。正如我们将看到的,参数 (a.k.a. parameters) 被分配给函数中的名称,但它们更多的是与对象引用有关,而不是与变量作用域有关。我们还将发现 Python 提供了额外的工具,如关键字、缺省值、任意参数收集器和提取器,这些工具允许以非常灵活的方式将参数发送到函数,我们将在示例中使用它们。
论据传递基础知识
在本书这一部分的前面,我提到参数是通过赋值传递的。对于新手来说,这有一些并非显而易见的影响,我将在本节中详细阐述。以下是向函数传递参数的要点概述:
参数是通过自动将对象赋值给局部变量名来传递的。函数参数--调用者发送的(可能是)共享对象的引用--只是 Python 赋值的另一个例子。因为引用是作为指针实现的,所以所有参数实际上都是通过指针传递的。作为参数传递的对象永远不会被自动复制。
在函数内部为参数名赋值不会影响调用者。当函数运行时,函数头中的参数名将成为函数作用域中新的本地参数名。函数参数名与调用者作用域中的变量名之间没有别名。
在函数中更改可变对象参数可能会影响调用者。另一方面,由于参数被简单地赋值给传入的对象,函数可以就地更改传入的可变对象,其结果可能会影响调用者。可变参数可以是函数的输入和输出。
有关引用的更多详情,请参阅第 6 章;我们在该章中学到的所有知识同样适用于函数参数,不过参数名的赋值是自动和隐式的。
Python 的按赋值传递方案与 C++ 的引用参数选项并不完全相同,但在实践中,它与C 语言(以及其它语言)的参数传递模型非常相似:
不可变参数实际上是 "按值 "传递的。 整数和字符串等对象是通过对象引用而不是复制来传递的,但由于无论如何都无法在原处更改不可变对象,因此其效果与复制非常相似。
可变参数实际上是 "通过指针 "传递的。对象(如列表和字典)也是通过对象引用传递的,这与 C 语言将数组作为指针传递的方式类似--可变对象可以在函数中就地更改,就像 C 语言的数组一样。
当然,如果您从未使用过 C 语言,Python 的参数传递模式会显得更加简单--它只涉及将对象赋值给名称,而且无论对象是否可变,它都是一样的。
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access