常量
一、常量
變量是變化的量,常量則是不變的量。python中沒有使用語法強制定義常量,也就是說,python中定義常量本質上就是變量。如果非要定義常量,變量名必須全大寫。
AGE_OF_NICK = 19
print(AGE_OF_NICK)
19
AGE_OF_NICK = AGE_OF_NICK + 1
print(AGE_OF_NICK)
20
如果是常量,那就沒必要更改,所以python就只制定了一個規范,而沒指定常量的語法,因此常量也是可以修改的,但不建議。
在c語言中有專門的常量定義語法,const int age = 19;
,一旦定義age
為常量,更改age
即會報錯 。
二、內置常量
內置常量
有少數的常量存在於內置命名空間中。 它們是:
False
bool 類型的假值。 給 False 賦值是非法的並會引發 SyntaxError。
True
bool 類型的真值。 給 True 賦值是非法的並會引發 SyntaxError。
None
NoneType 類型的唯一值。 None 經常用於表示缺少值,當因為默認參數未傳遞給函數時。 給 None 賦值是非法的並會引發 SyntaxError。
NotImplemented
二進制特殊方法應返回的特殊值(例如,__eq__()、__lt__()、__add __()、__rsub__() 等)表示操作沒有針對其他類型實現;為了相同的目的,可以通過就地二進制特殊方法(例如,__imul __()、__ rightnd__() 等)返回。 它的邏輯值為真。
注解 當二進制(或就地)方法返回``NotImplemented``時,解釋器將嘗試對另一種類型(或其他一些回滾操作,取決於運算符)的反射操作。 如果所有嘗試都返回``NotImplemented``,則解釋器將引發適當的異常。 錯誤返回的``NotImplemented``將導致誤導性錯誤消息或返回到Python代碼中的``NotImplemented``值。
參見 實現算數運算 為例。
注解 NotImplementedError 和 NotImplemented 不可互換,即使它們有相似的名稱和用途。 有關何時使用它的詳細信息,請參閱 NotImplementedError。
Ellipsis
與省略號文字字面 “...” 相同。 特殊值主要與用戶定義的容器數據類型的擴展切片語法結合使用。
__debug__
如果 Python 沒有以 -O 選項啟動,則此常量為真值。 另請參見 assert 語句。
注解 變量名 None,False,True 和 __ debug__ 無法重新賦值(賦值給它們,即使是屬性名,將引發 SyntaxError ),所以它們可以被認為是“真正的”常數。
由 site 模塊添加的常量
site 模塊(在啟動期間自動導入,除非給出 -S 命令行選項)將幾個常量添加到內置命名空間。 它們對交互式解釋器 shell 很有用,並且不應在程序中使用。
quit(code=None)
exit(code=None)
當打印此對象時,會打印出一條消息,例如“Use quit() or Ctrl-D (i.e. EOF) to exit”,當調用此對象時,將使用指定的退出代碼來引發 SystemExit。
copyright
credits
打印或調用的對象分別打印版權或作者的文本。
license
當打印此對象時,會打印出一條消息“Type license() to see the full license text”,當調用此對象時,將以分頁形式顯示完整的許可證文本(每次顯示一屏)。
三、用模塊和類實現真正的常量
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名字空間。