2015-08-28 10 views
9

Secondo il Documentation:Confrontando due variabili con 'è' operatore che sono dichiarati in una linea in pitone

L'implementazione corrente mantiene un array di oggetti interi per tutti gli interi tra -5 e 256, quando si crea un int in tale intervallo in realtà si ottiene solo un riferimento all'oggetto esistente. Quindi dovrebbe essere possibile modificare il valore di 1. Sospetto che il comportamento di Python in questo caso non sia definito. :-)

Quindi i seguenti comportamenti sono normali.

>>> a = 256 
>>> b = 256 
>>> a is b 
True 
>>> c = 257 
>>> d = 257 
>>> c is d 
False 

Ma quando dichiaro due variabili come questi, sto ottenendo Vero -

>>> e = 258; f=258; 
>>> e is f 
True 

Ho controllato l'identità degli oggetti a cui fa riferimento e f- e

>>> id(e) 
43054020 
>>> id(f) 
43054020 

Sono uguali.

La mia domanda è cosa sta succedendo quando stiamo dichiarando e ed f separandoci con il punto e virgola? Perché si riferiscono allo stesso oggetto (sebbene i valori siano fuori dalla portata dell'array Python di oggetti interi)?

Sarebbe meglio, per favore, spiegatelo come se lo stesse spiegando a un principiante.

+1

Python memorizza nella cache piccoli oggetti interi, che sono un dettaglio di implementazione. C'è un'ottimizzazione che consente di confrontare i piccoli numeri interi con, ma non fare affidamento su di esso. [relate1] (http://stackoverflow.com/questions/2988017/string-comparison-in-python-is-vs), [related2] (http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python) – luoluo

+4

Per arginare la marea di commenti sul fatto che si tratta di un duplicato noto, si prega di leggere attentamente la domanda. Questa non è la solita piccola domanda a memoria intera. Sono in grado di riprodurlo anche io. 'e = 258; f = 258' sulla stessa linea, stessi oggetti. 'e = 258' e' f = 258' su linee diverse, oggetti diversi. Colora me sorpreso. –

+0

@Cyphase no, non penso che la mia domanda sia doppia di quella domanda. Ho studiato quella domanda e le risposte pertinenti in precedenza. :) – ni8mr

risposta

5

Questo è non un comportamento imprevisto, secondo Python Data model è un dettaglio di implementazione:

Tipi interessano quasi tutti gli aspetti del comportamento dell'oggetto. Anche l'importanza dell'identità dell'oggetto è interessata: per i tipi immutabili , le operazioni che calcolano nuovi valori possono effettivamente restituire un riferimento a qualsiasi oggetto esistente con lo stesso tipo e valore, mentre per oggetti mutabili non è consentito . Ad esempio, dopo a = 1; b = 1, a eb può o non può riferirsi allo stesso oggetto con il valore uno, a seconda dell'implementazione, ma dopo c = []; d = [], c e d sono garantiti per fare riferimento a due diversi, unici, nuovi elenchi vuoti creati da . (Si noti che c = d = [] assegna lo stesso oggetto a entrambi c e d.)

+0

Grazie per la spiegazione. "per i tipi immutabili, le operazioni che calcolano nuovi valori possono effettivamente restituire un riferimento a qualsiasi oggetto esistente con lo stesso tipo e valore" - quindi e e f potrebbero riferirsi o meno allo stesso oggetto. Quindi a volte 'e is f' può restituire 'False'? Rimane un'altra domanda riguardo a e ed f stanno avendo valori fuori dal range dell'array di oggetti interi di Python. – ni8mr

+1

@ ni8mr dipende dall'implementazione ... :) In [CPython] (https://en.wikipedia.org/wiki/CPython) questo case * restituirà * sempre 'True', ma altre implementazioni di python potrebbero scegliere un comportamento diverso. – alfasin

+0

Dovrei accettare la risposta (poiché la mia domanda sembrava duplicata)? – ni8mr