2017-05-04 111 views
1

在下面的代碼A和B都具有相同的ID爲什麼在同一行創建的兩個對象具有相同的對象,但這與列表不同?

>>> a,b=470,470 
>>> id(a) 
32404032 
>>> id(b) 
32404032 

但不是在這裏,

>>> a = 470 
>>> b = 470 
>>> id(a) 
32403864 
>>> id(b) 
32344636 

並且如果在同一行中創建然後給予不同的ID

>>> a,b=[1,2], [1,2] 
>>> id(a) 
32086056 
>>> id(b) 
32653960 
>>> 
同一個列表對象

爲什麼在同一行上創建的相同整數的變量具有相同的ID,但是在不同行上創建的時候不是這樣,這與列表不同。

回答

2

是的,對於不可變的對象編譯器將創建常量並重新使用它們。但是,您不能爲列表等可變對象執行此操作,因爲如果您通過一個引用或另一個引用進行更改,則會操縱同一對象。

您可以通過查看代碼對象的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) 

這些實施細則(最佳化),你不應該依靠他們。

相關問題