获取这个简单的python代码,与re.compile实例相同。我注意到,尽管我使用的是相同的值,但它会创建两个实例,并相应地重复它们。
我想知道是否有人能说出这种行为的原因,
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>编辑:
作为@kimvais answered,原因在于持有最新任务的_。你看,如果你没有分配,而是打印,它是相同的,一直。
>>> 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>发布于 2012-02-06 12:55:47
我的猜测是,这与交互的python内部的return value being assigned to划线(_)有关--也就是说,由于_指向<_sre.SRE_Match object at 0x23cb238>,直到下一个rec.match完成为止,在_指向其他地方之前,不能重用相同的局部,旧的也可以回收。
发布于 2012-02-06 12:55:52
您所看到的是一个实现细节。实际上,您有6个<_sre.SRE_MATCH>对象的唯一实例。
由于您没有明确地引用它们,垃圾收集器将在适当的时候释放它们,从而允许重复使用相同的内存位置。
0x23cb1d0本质上是对象的内存位置,而不是GUID。
尝试将它们赋值给一个局部变量,您将看到,由于它们不是垃圾收集的,因此将为每个实例使用新的内存位置。
https://stackoverflow.com/questions/9160367
复制相似问题