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

Bob*_*ver 10 python constants python-3.x

在关于内置常量(不包括site常量)的文档中,它声明:

注:名称None,False,True并且__debug__不能被重新分配(分配给他们,甚至作为一个属性名称,提高SyntaxError),因此它们可以被认为是"真正的"常数.

如果我没有弄错,TrueFalse在Python 3中成为"真正的"内容.(正如副本中所述.)

问题是,为什么不是另外两个(Ellipsis,NotImplemented)"真实"的含量?是否有一个用例重新分配这些(numpyEllipsis吧?)已经从这种限制豁免呢?

加剧了我的困惑,在标准库类型的文档中,行为EllipsisNotImplemented行为都与类型相同None.即:

  • 他们是单身人士
  • 他们不支持特殊操作.

此问题与建议的副本无关:为什么在Python 3中将True和False更改为关键字.它提出了一些完全不同的东西,即为什么EllipsisNotImplemented 不是"真正的"常数,不是为什么TrueFalse哪里变成了一些.

Håk*_*Lid 5

您可以分配给任何不是关键字的有效标识符。有什么特别之处TrueFalseNone是他们两个关键字和标识符。您可以在此问题中了解其原因:

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

内置命令如NotImplementedEllipsis不特殊情况下,也不是intlisttype等。分配给NotImplemented不会改变内置常量。相反,您将名称绑定Ellipsis到当前范围内的不同值。原版Ellipsis没变。

分配给关键字是 SyntaxError。

您可以通过导入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']
Run Code Online (Sandbox Code Playgroud)

有很多内置的标识符不在该列表中,您可以指定新值intEllipsis等等。

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

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

  • 我了解不允许分配给关键字。问题不在于为什么分配给 `True` 是错误的,而是为什么 `Ellipsis` 和 `NotImplemented` 在可赋值时被指定为“常量”。当然,向后兼容性是一个问题,但是从 2 到 3 的转换将允许这样的更改,就像对 `True` 和 `False` 所做的那样。 (2认同)
  • 因为这些名字没有什么特别之处。就像 Python 中的任何其他非关键字标识符一样。 (2认同)