2013-07-16 21 views
10

In Java, le stringhe dichiarate esplicitamente sono internate dalla JVM, in modo che le dichiarazioni successive della stessa stringa producano due puntatori alla stessa istanza di stringa, anziché due stringhe separate (ma identiche).Le stringhe interne di Python?

Ad esempio:

public String baz() { 
    String a = "astring"; 
    return a; 
} 

public String bar() { 
    String b = "astring" 
    return b; 
} 

public void main() { 
    String a = baz() 
    String b = bar() 
    assert(a == b) // passes 
} 

La mia domanda è, CPython (o qualsiasi altro runtime Python) fanno la stessa cosa per le stringhe? Per esempio, se ho qualche classe:

class example(): 
    def __init__(): 
     self._inst = 'instance' 

e creare 10 istanze di questa classe, si ognuno di loro ha una variabile di istanza riferendosi alla stessa stringa in memoria, o dovrò finire con 10 stringhe separate ?

+3

Questo è chiamato interning, e sì, Python lo fa in parte, per stringhe più corte create come stringhe letterali. Vedi [Python string interning] (http://stackoverflow.com/q/15541404) –

+0

possibile duplicato di [Python '==' vs 'è' confronto stringhe, 'è' fallisce a volte, perché?] (Http: // stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why) – OptimusCrime

+0

@MartijnPieters - grazie, ma quanto sono corte le stringhe "più corte"? Questo runtime è dipendente o esiste uno standard per questo? – csvan

risposta

11

Questo è chiamato interning, e sì, Python lo fa in una certa misura, per stringhe più corte create come stringhe letterali. Vedi About the changing id of a Python immutable string per qualche discussione.

Interning è dipendente dal runtime, non esiste uno standard per questo. Interning è sempre un compromesso tra l'uso della memoria e il costo del controllo se si sta creando la stessa stringa. C'è un built-in intern() function di forzare il problema se siete così inclinato, che documenta alcuni del internato Python fa per voi automaticamente:

Normalmente, i nomi utilizzati in programmi Python vengono internati automaticamente, ed i dizionari utilizzati per mantenere gli attributi di modulo, classe o istanza hanno chiavi internate.

noti che Python 3 trasferisce la funzione intern() al sys module.

+0

Si noti che il built-in di 'intern' sembra essere stato rimosso in Python 3. Non mi sento come scavare esattamente quale versione in questo momento. – zwol

+0

@zwol: 3.0. Vedrò se riesco a trovare la motivazione, probabilmente in un PEP da qualche parte. –

+0

@zwol: è stato spostato nel modulo 'sys'. –

3

Un modo abbastanza semplice per dire è utilizzando id(). Tuttavia, come menziona @MartijnPieters, questo dipende dal tempo di esecuzione.

class example(): 

    def __init__(self): 
     self._inst = 'instance' 

for i in xrange(10): 
    print id(example()._inst)