2016-03-04 56 views
11

In python 3.5, è possibile prevedere quando otterremo una stringa internata o quando otterremo una copia? Dopo aver letto alcune risposte Stack Overflow su questo problema, ho trovato il this one il più utile ma non ancora completo. Che ho guardato Python docs, ma l'internato non è garantito per defaultQuali sono le regole per l'internamento delle stringhe di cpython?

Normalmente, i nomi utilizzati in programmi Python vengono internati automaticamente, ed i dizionari utilizzato per contenere il modulo, gli attributi di classe o di istanza sono internati chiavi.

Quindi, la mia domanda riguarda interiori intern() condizioni, vale a dire il processo decisionale (se stringa stagista letterale o meno): il motivo per cui lo stesso pezzo di codice funziona su un sistema e non su un altro e quali regole hanno fatto autore della risposta su mentioned topic dire quando dice

le regole per quando questo accade sono abbastanza contorto

+0

Basta usare '==' e non pensarci più. È comunque il dettaglio di implementazione. – wim

+3

@erip Credo che OP ne sia a conoscenza. Dopo aver superato lo standard, questa domanda sembra chiedere delle regole di internamento. – timgeb

+1

Se vuoi davvero conoscere le differenze nell'implementazione, probabilmente avrebbe senso specificare le versioni Python installate su entrambi i sistemi. –

risposta

3

Pensi che ci siano le regole?

L'unica regola per l'internazione è che il valore di ritorno di intern è internato. Tutto il resto dipende dai capricci di chi ha deciso che un pezzo di codice dovrebbe o non dovrebbe fare internare. Ad esempio, "left" ottiene internati da PyCodeNew:

/* Intern selected string constants */ 
for (i = PyTuple_GET_SIZE(consts); --i >= 0;) { 
    PyObject *v = PyTuple_GetItem(consts, i); 
    if (!all_name_chars(v)) 
     continue; 
    PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i)); 
} 

La "regola" è che un oggetto stringa nel co_consts di un oggetto di codice Python viene internato se si tratta puramente di caratteri ASCII che sono legali in un identificatore Python . "left" viene internato, ma non lo è "as,df" e "1234" verrà internato anche se un identificatore non può iniziare con una cifra. Mentre gli identificatori possono contenere caratteri non ASCII, tali caratteri sono ancora respinti da questo controllo. Gli identificativi effettivi non passano mai attraverso questo codice; ottengono internamente incondizionatamente poche righe, ASCII o no. Questo codice è soggetto a modifiche, e c'è un sacco di altro codice che fa cose internamente o internamente simili.

Chiedendoci le "regole" per l'internazionalizzazione delle stringhe è come chiedere a un meteorologo quali sono le regole per sapere se piove sul tuo matrimonio. Possiamo dirvi parecchio su come funziona, ma non sarà molto utile a voi, e avrete sempre sorprese.

+1

Sì. Come al solito con i dettagli di implementazione, ** RTFS ** è l'unica risposta davvero .. – wim

-3

da quello che ho capito dal post si è collegato:

Quando si utilizza if a == b, si sta verificando se il valore della a è il valore di b, mentre quando si utilizza if a is b, si sta verificando se a e b sono lo stesso oggetto (o condividono la stessa posizione nella memoria).

Ora python esegue internamente le stringhe costanti (definite da "blabla"). Quindi:

>>> a = "abcdef" 
>>> a is "abcdef" 
True 

Ma quando lo fai:

>>> a = "".join([chr(i) for i in range(ord('a'), ord('g'))]) 
>>> a 
'abcdef' 
>>> a is "abcdef" 
False 

Nel linguaggio di programmazione C , utilizzando una stringa con "" renderà un const char *. Penso che questo sia quello che sta succedendo qui.

Problemi correlati