为什么 6 个内置常量中的 2 个是可分配的?



在关于内置常量(不包括site常量(的文档中指出:

注意:名称NoneFalseTrue__debug__不能重新赋值(赋值,即使作为属性名称,也会引发SyntaxError(,因此它们可以被视为"真"常量。

如果我没记错的话,TrueFalse在 Python 3 中成为了"真正的"同量。(如副本中所述。

问题是,为什么其他两个(EllipsisNotImplemented(不是"真正的"连续体?是否有重新分配这些(也许是Ellipsisnumpy?(的用例使它们免于此限制?

更让我困惑的是,在标准库类型的文档中,EllipsisNotImplemented类型在行为上都与None类型相同。即:

  • 他们是单例
  • 他们不支持特殊操作。

这个问题与提议的重复无关:为什么在Python 3中将True和False更改为关键字。它问的是完全不同的问题,即为什么EllipsisNotImplemented不是"真"常数而不是为什么TrueFalse变成了常数。

您可以分配给任何不是关键字的有效标识符。TrueFalseNone的特别之处在于它们是关键字又是标识符。您可以在此问题中阅读有关其原因的信息:

为什么 True 和 False 在 Python 3 中被更改为关键字

诸如NotImplementedEllipsis之类的内置不是特例,intlisttype等也不是特例。分配给NotImplemented不会更改内置常量。而是将名称Ellipsis绑定到当前作用域中的其他值。原始Ellipsis不会更改。

分配给关键字是一个语法错误。

您可以通过导入keywords模块来查看关键字列表。

>>> import keyword
>>> keyword.kwlist
['False',
'None',
'True',
'and',
'as',
'assert',
'break',
'class',
'continue',
'def',
'del',
'elif',
'else',
'except',
'finally',
'for',
'from',
'global',
'if',
'import',
'in',
'is',
'lambda',
'nonlocal',
'not',
'or',
'pass',
'raise',
'return',
'try',
'while',
'with',
'yield']

此列表中有很多内置标识符,您可以为intEllipsis等分配新值。

...是一种特殊情况,因为它首先不是有效的标识符名称,因此无法分配。

与许多其他语言相比,Python 保留关键字的列表非常短。一个原因可能是保持与代码的向后兼容性,这些代码由于某种原因在成为语言的一部分之前使用了标识符,例如Ellipsis

最新更新