首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python以这种方式(成对)处理局部变量()的原因是什么?

python以这种方式(成对)处理局部变量()的原因是什么?
EN

Stack Overflow用户
提问于 2012-02-06 12:50:07
回答 2查看 103关注 0票数 5

获取这个简单的python代码,与re.compile实例相同。我注意到,尽管我使用的是相同的值,但它会创建两个实例,并相应地重复它们。

我想知道是否有人能说出这种行为的原因,

  • 为什么要创建第二个实例?
  • 为什么只有两个?
  • ,为什么每次都选择另一个而不是随机选择?

CLI代码:

代码语言:javascript
复制
>>> 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,原因在于持有最新任务的_。你看,如果你没有分配,而是打印,它是相同的,一直。

代码语言:javascript
复制
>>> 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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-06 12:55:47

我的猜测是,这与交互的python内部的return value being assigned to划线(_)有关--也就是说,由于_指向<_sre.SRE_Match object at 0x23cb238>,直到下一个rec.match完成为止,在_指向其他地方之前,不能重用相同的局部,旧的也可以回收。

票数 8
EN

Stack Overflow用户

发布于 2012-02-06 12:55:52

您所看到的是一个实现细节。实际上,您有6个<_sre.SRE_MATCH>对象的唯一实例。

由于您没有明确地引用它们,垃圾收集器将在适当的时候释放它们,从而允许重复使用相同的内存位置。

0x23cb1d0本质上是对象的内存位置,而不是GUID。

尝试将它们赋值给一个局部变量,您将看到,由于它们不是垃圾收集的,因此将为每个实例使用新的内存位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9160367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档