一、常量
变量是变化的量,常量则是不变的量。python中没有使用语法强制定义常量,也就是说,python中定义常量本质上就是变量。
如果是常量,那就没必要更改,所以python就只制定了一个规范,而没指定常量的语法,因此常量也是可以修改的,但不建议。
二、内置常量
内置常量
有少数的常量存在于内置命名空间中。 它们是:
False
bool 类型的假值。 给 False 赋值是非法的并会引发 SyntaxError。
True
bool 类型的真值。 给 True 赋值是非法的并会引发 SyntaxError。
None
NoneType 类型的唯一值。 None 经常用于表示缺少值,当因为默认参数未传递给函数时。 给 None 赋值是非法的并会引发 SyntaxError。
NotImplemented
二进制特殊方法应返回的特殊值(例如,eq()、lt()、__add __()、rsub() 等)表示操作没有针对其他类型实现;为了相同的目的,可以通过就地二进制特殊方法
Ellipsis
与省略号文字字面 “...” 相同。 特殊值主要与用户定义的容器数据类型的扩展切片语法结合使用。
三、用模块和类实现真正的常量
const.py
class _const:
class ConstError(TypeError) : pass
def __setattr__(self, key, value):
# self.__dict__
if key in self.__dict__:
data="Can't rebind const (%s)" % key
raise self.ConstError(data)
self.__dict__[key] = value
import sys
sys.modules[__name__] = _const()
test.py
import const
const.c=1
print(const.c) # 1
const.c=2 #const.ConstError: Can't rebind const (c)
sys.modules[key] =value : 返回系统导入的模块字段,key是模块名,value是模块
Python中所有加载到 内存的模块都放在sys.modules。sys.modules是一个全局字典,字典sys.modules对于加载模块起到了缓冲的作用,当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。件,模块文件可以是py、pyc、pyd,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的Local名字空间。
网友评论