Python 中的常数到底是什么?

What exactly constitutes a constant in Python?

PEP 8 prescribes

Constants are usually defined on a module level and written in all capital letters with underscores separating words. Examples include MAX_OVERFLOW and TOTAL.

我知道这只是一个命名约定,但我很想知道是否有官方或广泛接受的定义来说明常量与半私有变量的实际构成。

这是否仅限于您所说的 mathematical constants? (即float, int, complex)

或者它会包含在模块级别定义的 datetime.date 对象或字符串之类的东西吗?包含 keys/values 混合类型的字典怎么样?如果答案是否定的,是否应该将这些类型的对象定义为具有 _leading_underscore 的(准)私有变量?

嗯,PEP 8 编码约定主要是 Python 标准库编写的:

This document gives coding conventions for the Python code comprising the standard library in the main Python distribution.

搜索 Python 3.5 标准库中的一些模块,以及通常的字符串和数字,可以找到

UUIDs, uuid.py:

NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')

正则表达式,smtplib.py

OLDSTYLE_AUTH = re.compile(r"auth=(.*)", re.I)

词典,plistlib.py:

_BINARY_FORMAT = {1: 'B', 2: 'H', 4: 'L', 8: 'Q'}

frozensets, asyncore.py:

_DISCONNECTED = frozenset({ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, ...

一个datetime.date在calendar.py

_EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal()

因此基本上任何应该在整个执行过程中保持不变的东西,即使它是可变类型(plistlib.py 中的字典)。

对于 python 中的大部分内容,常量的 PEP8 命名约定只是为了帮助阅读代码的任何程序员知道不要更改特定的 "constant" 在其他情况下像 C 这样的语言它实际上可以减少执行代码所需的时间。

The Benefits of Constants 上查看此 post。

常量只是一个永远不会改变的值。

在 OOP 中,声明私有或 public 常量很有用,但对于 python 而言,"Constants" 和常规变量没有功能分离。

在其他支持真正常量的编程语言中还有一件事,如果您将一个值声明为常量,那么即使您稍后尝试重新分配该值,该值也不会改变。然而,在 Python 中,没有真正的常量,因此我们使用命名约定来帮助我们记住不要更改该值。