python以这种方式(成对)处理locals()的原因是什么?

Tzu*_*hay 5 python

获取这个简单的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>
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@kimvais 回答的那样,原因在于_它保留了最新的任务.看,如果不分配,而不是打印,它始终是相同的.

>>> 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>
Run Code Online (Sandbox Code Playgroud)

Kim*_*ais 8

我的猜测是,这与在交互式python shell内部分配给underscore(_)的返回值有关 - 即,因为_指向<_sre.SRE_Match object at 0x23cb238>'直到下一个rec.match完成,所以相同的本地不能重复使用,直到_指向其他地方和旧的可以回收.