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
e256
, 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 di1
. 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.
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
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. –
@Cyphase no, non penso che la mia domanda sia doppia di quella domanda. Ho studiato quella domanda e le risposte pertinenti in precedenza. :) – ni8mr