2015-07-07 10 views
12

Nella inattività pitone:Comportamento diverso in script python e in idle python?

>>> a=1.1 
>>> b=1.1 
>>> a is b 
False 

Ma quando ho messo il codice in uno script ed eseguirlo, mi metterò un risultato diverso:

$cat t.py 
a=1.1 
b=1.1 
print a is b 
$python t.py 
True 

perché è successo? So che is confronta lo id di due oggetti, quindi perché gli ID di due oggetti sono uguali/unici nello script/idle Python?

Ho anche scoperto che, se utilizzo un int piccolo, ad esempio 1, anziché 1.1, il risultato sarà lo stesso sia nello script python che in idle python. Perché il piccolo int e il piccolo float hanno un comportamento diverso?

Sto usando CPython 2.7.5.

+2

vedi: http://stackoverflow.com/questions/15171695/weird-integer-cache-inside-python-2-6 – Will

risposta

8

Quando Python esegue un file di script, l'intero file viene analizzato per primo. Si può notare che quando si introduce un errore di sintassi da qualche parte: indipendentemente da dove si trova, impedirà l'esecuzione di qualsiasi riga.

Quindi, poiché Python analizza il file per primo, i letterali possono essere caricati in modo efficace nella memoria. Poichè Python sa che questi sono costanti, tutte le variabili che rappresentano quei valori costanti possono puntare allo stesso oggetto in memoria. Quindi l'oggetto è condiviso.

Questo funziona per interi e galleggianti, ma anche per stringhe; anche quando v'è un'espressione costante che deve essere valutato prima:

a = "foo" 
b = "foo" 
c = "fo" + "o" 
print(a is b) 
print(a is c) 

Ora in IDLE, il comportamento è molto diverso: Come interprete interattivo, IDLE esegue ogni linea separatamente. Quindi, a = 1.1 e b = 1.1 vengono eseguiti in contesti separati, il che rende impossibile (o anche molto difficile) capire che entrambi condividono lo stesso valore letterale costante e potrebbero condividere la memoria. Quindi, l'interprete assegnerà due oggetti diversi, il che fa fallire il controllo dell'identità usando is.

Per numeri interi piccoli, la situazione è leggermente diversa. Poiché vengono spesso utilizzati, CPython memorizza staticamente un insieme di numeri interi (nell'intervallo tra -5 e 256) e rende ogni valore di questi punti allo stesso oggetto int. Ecco perché ottieni un risultato diverso per i numeri interi piccoli rispetto a qualsiasi altro oggetto. Vedere anche le seguenti domande:

Problemi correlati