2012-02-06 18 views
5

Ottieni questo semplice codice Python, uguale a quello dell'istanza di re.compile. Ho notato che anche se sto usando lo stesso valore, crea due istanze e le ripete di conseguenza.Qual è la ragione per cui python gestisce locals() in questo modo (in coppia)?

Mi chiedo se si può dire la ragione di questo comportamento,

  • Perché si crea la seconda istanza a tutti?
  • Perché solo due?
  • E perché ogni volta scelto l'altro e non a caso?

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

Edit:

Come @kimvaisanswered, la ragione risiede nel _ che detiene l'ultima assegnazione. vedi, se non stai assegnando, piuttosto stampando, è lo stesso, sempre.

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

risposta

8

mio ipotesi è che questo ha qualcosa a che fare con la return value being assigned per sottolineare (_) internamente nella shell interattiva di Python - vale a dire dal _ sta puntando a <_sre.SRE_Match object at 0x23cb238> 'til la prossima rec.match si completa lo stesso locale non può essere riutilizzato fino a _ punti da qualche altra parte e il vecchio può essere riciclato.

+1

Proprio quello che stavo per suggerire. +1. Prova a inserire i comandi in uno script e a eseguirlo; quindi l'allocatore in realtà riutilizza l'indirizzo (almeno sulla mia macchina Linux). –

+0

che * suona come la risposta giusta, aspetterò altri riferimenti prima di contrassegnare questa risposta come ** corretta **. –

1

Quello che state vedendo è un dettaglio di implementazione. In realtà hai avuto 6 istanze uniche dell'oggetto <_sre.SRE_MATCH>.

Poiché non è stato fatto alcun riferimento esplicito, il garbage collector li libera a tempo debito, consentendo di riutilizzare la stessa posizione di memoria.

0x23cb1d0 è essenzialmente la posizione di memoria dell'oggetto, non un GUID.

Provare ad assegnare questi a una variabile locale, e vedrete che poiché non sono garbage collection, verranno utilizzate nuove posizioni di memoria per ogni istanza.

+0

ma che ancora non spiega perché gli stessi due rari usati ripetutamente, vero? –

Problemi correlati