2012-02-06 64 views
5

獲取這個簡單的Python代碼,與re.compile實例相同。 我注意到即使我使用的是相同的值,它會創建兩個實例,並相應地重複它們。python以這種方式處理locals()的原因是什麼(成對)?

我不知道如果一看就知道了這種現象的原因,

  • 爲什麼它在所有創建的第二個實例?
  • 爲什麼只有兩個?
  • 爲什麼每次選擇另一個而不是隨機?

的CLI代碼:

>>> import re 
>>> 
>>> rec = re.compile("(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)") 
>>> 
>>> rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb238> 
>>> rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb238> 
>>> rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb238> 
>>> rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 

編輯:

由於@kimvaisanswered,原因在保持最新的賦值_規定。 請參閱,如果您不分配,而是打印,則始終是相同的。

>>> print rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> print rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> print rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> print rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> print rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 
>>> print rec.match('www.example.com') 
<_sre.SRE_Match object at 0x23cb1d0> 

回答

8

猜測是,這有什麼東西在交互式Python外殼與return value being assigned做下劃線(_)內部 - 因爲_即指向<_sre.SRE_Match object at 0x23cb238>,直到下一個rec.match完成相同的地方不能重複使用,直到_指向其他地方,舊的可以回收。

+1

正是我想要建議的。 +1。嘗試將這些命令放入腳本並運行該腳本;那麼分配器實際上會重用這個地址(至少在我的Linux機器上)。 – 2012-02-06 12:58:23

+0

*聽起來像是正確的答案,我會在將此答案標記爲**正確的**之前等待更多參考。 – 2012-02-06 13:00:41

1

你看到的是一個實現細節。您實際上有6個唯一的<_sre.SRE_MATCH>對象實例。

由於您沒有明確提及它們,垃圾收集器會在適當的時間釋放它們,從而允許重新使用相同的內存位置。

0x23cb1d0本質上是對象的內存位置,而不是GUID。

嘗試將這些分配給局部變量,並且您會看到由於它們未被垃圾收集,因此將爲每個實例使用新的內存位置。

+0

但這仍然不能解釋爲什麼兩個同樣的罕見重複使用,是嗎? – 2012-02-06 12:59:29

相關問題