为什么Python内置类型名称不是保留关键字?

8
换句话说,为什么Python允许变量名与内置类型名称(如int、float、list等)相同?(相比之下,C++的内置类型名称都是保留的)。考虑以下示例。
# int = 1
i = 2
if type(i) == int:
    print 'Is int'
else:
    print 'Not int'

输出结果是"Is int"。然而,如果我取消注释第一行,输出将会是"Not int"。显然,我的"int"已经覆盖了内置类型int。在我看来,这是潜在的危险。


2
为什么它们需要这样做?那将会有很多保留关键字,而有时 id 是函数中一个很好的本地名称。 - Martijn Pieters
1
我必须同意你的看法,如果它们被保留会更好。我喜欢C++的原因之一是在这方面它感觉更“安全”。一个解决方法是使用一个可以不同颜色突出显示内置类型的编辑器。 - texasflood
2个回答

18

以下是来自 Python 语言设计者撰写的Python 历史博客文章的内容:

由于在任何 Python 程序中都不能将这些作为变量或函数名称使用,因此每个使用 Python 的人都必须了解语言中所有保留字,即使他们不需要它们。出于这个原因,我们试图保持保留字列表尽可能小,核心开发人员在将新的保留字添加到语言之前会反复考虑很长时间。

内置名称只是系统提供的对象,带有预定义值的变量。您可以按模块或函数重新定义它们。将此(相当的)名称列表作为保留关键字会违背上述哲学。

将内置类型和函数作为保留关键字也会使向该列表中引入任何新名称变得非常困难。向保留关键字列表添加内容会对前向兼容性产生严重影响。想象一下向语言中添加一个color类型;为了避免使用该新关键字,需要重新编写处理图像的所有代码。

引用同一篇文章:

「当我们决定添加新关键字时,我们会在至少一个版本之前开始停用宣传活动,警告开发人员选择不同的变量名称。」

[...]

对于内置函数没有这样的担忧。只要您不尝试在同一函数中使用新内置函数,代码使用新内置函数名称作为变量或函数名称仍将继续运行。虽然我们仍然尝试谨慎地引入新的内置函数,但至少我们不必担心仅通过向语言添加内容就会破坏工作代码。


1

这些是所有保留关键字。

解析Python代码时,Python解释器使用许多技术来确定用户想要做什么——例如,如果代码包含以下内容,则可能包括行连接:

my_list = [1,
           2,
           3]

一般来说,词法分析:关键字帮助Python解释器理解程序员的意图,因为程序员“按规则操作”。你不能(也不应该)将变量命名为for,因为当Python解释器读取该单词时,它会理解到涉及某个循环,同样适用于class(用于声明类)和所有关键字(它们在程序中都具有特定的作用)。
为什么内置类型不是保留字?因为这不是Python解释器的工作方式,它没有问题理解你正在将值分配给变量。
更多信息(除了给出的链接之外)可以在这里找到。

@poke 关键字链接到Python已经失效。 - quamrana
@quamrana 对不起,我没有实际测试链接... ^^" 已修复。 - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接