Skip to Content
《学习 Python》第 5 版
book

《学习 Python》第 5 版

by Mark Lutz
May 2025
Intermediate to advanced
1648 pages
23h 5m
Chinese
O'Reilly Media, Inc.
Content preview from 《学习 Python》第 5 版

第 18 章 争论 论据

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

第 17 章探讨了 Python作用域背后的细节--变量定义和查找的位置。正如我们所学到的,在代码中定义名称的位置决定了它的大部分含义。本章通过研究 Python参数传递的概念--将对象作为输入发送给函数的方式--继续讲述函数的故事。正如我们将看到的,参数 (a.k.a. parameters) 被分配给函数中的名称,但它们更多的是与对象引用有关,而不是与变量作用域有关。我们还将发现 Python 提供了额外的工具,如关键字、缺省值、任意参数收集器和提取器,这些工具允许以非常灵活的方式将参数发送到函数,我们将在示例中使用它们。

论据传递基础知识

在本书这一部分的前面,我提到参数是通过赋值传递的。对于新手来说,这有一些并非显而易见的影响,我将在本节中详细阐述。以下是向函数传递参数的要点概述:

  • 参数是通过自动将对象赋值给局部变量名来传递的。函数参数--调用者发送的(可能是)共享对象的引用--只是 Python 赋值的另一个例子。因为引用是作为指针实现的,所以所有参数实际上都是通过指针传递的。作为参数传递的对象永远不会被自动复制。

  • 在函数内部为参数名赋值不会影响调用者。当函数运行时,函数头中的参数名将成为函数作用域中新的本地参数名。函数参数名与调用者作用域中的变量名之间没有别名。

  • 在函数中更改可变对象参数可能会影响调用者。另一方面,由于参数被简单地赋值给传入的对象,函数可以就地更改传入的可变对象,其结果可能会影响调用者。可变参数可以是函数的输入和输出。

有关引用的更多详情,请参阅第 6 章;我们在该章中学到的所有知识同样适用于函数参数,不过参数名的赋值是自动和隐式的。

Python 的按赋值传递方案与 C++ 的引用参数选项并不完全相同,但在实践中,它与C 语言(以及其它语言)的参数传递模型非常相似:

  • 不可变参数实际上是 "按值 "传递的。 整数和字符串等对象是通过对象引用而不是复制来传递的,但由于无论如何都无法在原处更改不可变对象,因此其效果与复制非常相似。

  • 可变参数实际上是 "通过指针 "传递的。对象(如列表和字典)也是通过对象引用传递的,这与 C 语言将数组作为指针传递的方式类似--可变对象可以在函数中就地更改,就像 C 语言的数组一样。

当然,如果您从未使用过 C 语言,Python 的参数传递模式会显得更加简单--它只涉及将对象赋值给名称,而且无论对象是否可变,它都是一样的。

参数和共享引用

为了说明参数传递属性的作用,请看下面的代码:

>>> def f(a):                 # a is assigned to (references) the passed object
        a = 99                # Changes local variable a only

>>> b = 88
>>> f(b)                      # a and b both reference same 88 initially
>>> print(b)                  # b is not changed
88

在本例中,在调用f(b) 函数时,变量a被赋值给对象88 ,但a只存在于被调用的函数中。在函数内部更改a 对调用函数的地方没有任何影响;它只是将局部变量a 重置为一个完全不同的对象。

这就是缺乏名称别名的意思--在函数内部对参数名称进行赋值(例如a=99 )并不会神奇地改变函数调用作用域中的变量(如b )。参数名最初可以共享传递的对象(它们本质上是指向这些对象的指针),但只是在函数首次调用时暂时共享。一旦参数名被重新分配,这种关系就会结束。 ...

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

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

学习 Java,第 6 版

学习 Java,第 6 版

Marc Loy, Patrick Niemeyer, Daniel Leuck
《高性能 Python》第二版

《高性能 Python》第二版

Micha Gorelick, Ian Ozsvald

Publisher Resources

ISBN: 9798341656963