2012-02-06 67 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

相关问题