2012-02-06 9 views
5

Obtenga este código simple de python, la misma coincidencia con la instancia de re.compile. Noté que aunque estoy usando el mismo valor, crea dos instancias y las repite en consecuencia.¿Cuál es la razón por la cual python maneja los locales() de esta manera (en pares)?

Me pregunto si se puede decir la razón de este comportamiento,

  • ¿Por qué se crea la segunda instancia en absoluto?
  • ¿Por qué solo dos?
  • ¿Y por qué cada vez escogió la otra y no al azar?

el código de la 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> 

Editar:

Como @kimvaisanswered, la razón reside en la _ que tiene la última asignación. , si no asigna, imprime, es la misma, todo el tiempo.

>>> 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> 

Respuesta

8

Mi suposición es que esto tiene algo que ver con la return value being assigned para subrayar (_) internamente en el intérprete de Python interactiva - es decir, desde _ está apuntando a <_sre.SRE_Match object at 0x23cb238> 'hasta el próximo rec.match se ha completado el mismo local, no se puede reutilizar hasta que _ señale a otro lugar y el anterior se puede reciclar.

+1

Justo lo que estaba a punto de sugerir. +1. Intenta poner los comandos en un script y ejecutar eso; entonces el asignador realmente reutiliza la dirección (en mi caja Linux al menos). –

+0

que * suena * como la respuesta correcta, esperaré algunas referencias más antes de marcar esta respuesta como la ** correcta **. –

1

Lo que está viendo es un detalle de implementación. En realidad, tuvo 6 instancias únicas del objeto <_sre.SRE_MATCH>.

Dado que no hizo referencias explícitas a ellos, el recolector de basura los liberaría a su debido tiempo, permitiendo que se reutilizara esa misma ubicación de memoria.

El 0x23cb1d0 es esencialmente la ubicación de memoria del objeto, no un GUID.

Intente asignarlos a una variable local y verá que, dado que no son basura, se usarán nuevas ubicaciones de memoria para cada instancia.

+0

pero eso aún no explica por qué exactamente los mismos dos raros se usan repetidamente, ¿o sí? –

Cuestiones relacionadas