是的,對於不可變的對象編譯器將創建常量並重新使用它們。但是,您不能爲列表等可變對象執行此操作,因爲如果您通過一個引用或另一個引用進行更改,則會操縱同一對象。
您可以通過查看代碼對象的co_consts
屬性來提取常量;得到其中的一個最簡單的方法是使用compile()
功能:
>>> compile("a,b=470,470", '', 'single').co_consts
(470, None, (470, 470))
在交互式解釋,單獨的線路分別編譯,所以有獨立常數。在一個單獨的Python腳本中,每個範圍都有自己的常量,允許更廣泛的共享。在交互式解釋,創建一個函數或類來獲得一個單獨的範圍與自己的常量:
>>> def foo():
... a = 470
... b = 470
... return id(a) == id(b)
...
>>> foo()
True
>>> foo_code = compile('''\
... def foo():
... a = 470
... b = 470
... return id(a) == id(b)
... ''', '', 'single')
>>> foo_code = compile('''
... def foo():
... a = 470
... b = 470
... return id(a) == id(b)
... ''', '', 'single')
>>> foo_code.co_consts
(<code object foo at 0x1018787b0, file "", line 2>, None)
>>> foo_code.co_consts[0].co_consts # constants for the foo function code object
(None, 470)
這些實施細則(最佳化),你不應該依靠他們。