La -5 a 256 gamma ha a che fare con la following:
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 si in realtà basta recuperare un riferimento all'oggetto esistente.
A dimostrazione di ciò, si noti come id(123)
continua a tornare lo stesso valore, mentre id(9999)
possono restituire valori diversi:
In [18]: id(123)
Out[18]: 9421736
In [19]: id(123)
Out[19]: 9421736
In [20]: id(9999)
Out[20]: 9708228
In [21]: id(9999)
Out[21]: 10706060
Si tratta naturalmente di un artefatto della implementazione corrente. Un'implementazione Python differente potrebbe non farlo, o potrebbe utilizzare un intervallo diverso.
Per quanto riguarda il tuo ultimo esempio:
In [14]: a=[999999, 2, 3]
In [15]: b=a[:]
In [16]: map(id, a)
Out[16]: [10908252, 9421180, 9421168]
In [17]: map(id, b)
Out[17]: [10908252, 9421180, 9421168]
Come si può vedere, [:]
copia semplicemente i riferimenti. Questo spiega perché a[i] is b[i]
valuta True
per tutti i
.
Credo che tu stia confondendo due cose strane: 1) 'b = a [:]' copia il riferimenti a tutti gli interi, quindi 'b [0]' punta allo stesso int di 'a [0]' e 'a [0] è b [0]' restituisce 'Vero'. 2) i riferimenti ai numeri da -5 a 256 vengono mantenuti in ogni momento. – Shep