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 版

第 6 章 动态类型插曲

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

在上一章中,我们通过学习 Python 数字类型和操作,开始深入探索 Python 的核心对象类型。我们将在下一章继续我们的对象类型之旅,但在继续之前,重要的是您要掌握 Python 编程中最基本的思想,当然这也是 Python 语言简洁性和灵活性的基础--动态类型,以及它所隐含的多态性。

正如您在这里和本书中看到的,在 Python 中,我们不声明脚本使用的对象的具体类型。事实上,大多数程序甚至不应该关心特定类型;作为交换,它们自然适用于更多的上下文,有时我们甚至无法提前计划。因为动态类型是这种灵活性的根源,同时也是新手的潜在绊脚石,所以让我们在这里做一个简短的边游,来探索一下这个模型。

声明丢失事件

如果你有 C、C++ 或 Java 等编译语言或静态类型语言的背景,你可能会发现自己在本书的这一点上有些困惑。到目前为止,我们一直在使用变量,而没有声明变量的存在或类型,这在某种程度上是可行的。例如,当我们在交互会话或程序文件中键入a = 3 时,Python 如何知道a 应该代表一个整数?那么,Python 又怎么知道a 是什么呢?

一旦你开始问这样的问题,你就进入了Python动态类型模型的领域。在 Python 中,类型是在运行时自动确定的,而不是根据代码中的声明。这意味着您永远不会提前声明变量 (如果您记住这一切都可以归结为变量、对象以及它们之间的联系,那么这个概念也许会更容易理解)。

变量、对象和引用

正如您在 中所看到的,在本书迄今为止使用的许多示例中,当您在 Python 中运行诸如a = 3 这样的赋值语句时,即使您从未告诉过 Python 使用a 作为变量名,或者a 应该代表一个整数类型的对象,它也能工作。在 Python 语言中,这一切都很自然,如下所示:

创建变量

一个变量 (在 Python 中也称为名称),如a ,在代码第一次赋值时就被创建了。以后的赋值会改变已经创建的名称的值。从技术上讲,Python 在代码运行之前就检测到了一些名称,但你可以认为是初始赋值产生了变量。

变量类型

变量从来没有任何与之相关的类型信息或约束条件。类型的概念存在于对象中,而不是名称中。变量在本质上是通用的;它们总是简单地指代某个时间点上的某个特定对象。

可变用途

当一个变量出现在表达式中时,它将立即被替换为当前所指的对象,无论该对象是什么。此外,所有变量在使用前都必须明确赋值;引用未赋值的变量会导致错误。

总之,变量在赋值时创建,可以引用任何类型的对象,并且必须在引用之前赋值。这意味着,你永远不需要声明脚本中使用的名称,但你必须先初始化名称,然后才能更新它们;例如,计数器必须先初始化为零,然后才能增加计数器。

这种动态类型模型与传统语言的类型模型截然不同。刚开始使用时,如果明确区分名称和对象,通常会更容易理解这种模型。例如,当我们给变量赋值时,可以这样说

>>> a = 3                # Assign a name to an object

至少在概念上,Python 会执行三个不同的步骤来执行请求。这些步骤反映了 Python 语言中所有赋值的操作:

  1. 创建一个对象来表示值3

  2. 如果变量a 不存在,则创建该变量。

  3. 将变量a 链接到新对象3

最终,Python 内部将形成类似图 6-1 的结构。如草图所示,变量和对象存储在内存的不同部分,并通过链接关联(链接在图中显示为指针)。变量总是链接到对象,而不会链接到其他变量,但较大的对象可能会链接到其他对象(例如,一个 ...

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