Rendere gli interi mutabili sarebbe molto controintuitivo al modo in cui siamo abituati a lavorare con loro.
Considerate questo frammento di codice:
a = 1 # assign 1 to a
b = a+2 # assign 3 to b, leave a at 1
Dopo queste assegnazioni sono eseguite prevediamo un avere il valore 1 e b avere il valore 3. L'operazione di aggiunta sta creando un nuovo valore intero dal intero memorizzato in un e un'istanza del numero intero 2. Se l'operazione di addizione appena preso il numero intero a un e proprio mutato poi sia un e b avrebbe il valore 3.
Quindi ci aspettiamo che le operazioni aritmetiche creino nuovi valori per i loro risultati - non per mutare i loro parametri di input.
Tuttavia, ci sono casi in cui la mutazione di una struttura dati è più comoda e più efficiente. Supponiamo per il momento che list.append(x)
non abbia modificato list
ma abbia restituito una nuova copia di list
con x
aggiunto. Poi una funzione come questa:
def foo():
nums = []
for x in range(0,10):
nums.append(x)
return nums
sarebbe solo restituire la lista vuota. (Ricordate - qui nums.append(x)
non altera nums
- restituisce una nuova lista con x
allegata Ma questa nuova lista non viene salvato da nessuna parte..)
avremmo scrivere il foo
di routine in questo modo:
def foo():
nums = []
for x in range(0,10):
nums = nums.append(x)
return nums
(Questo, infatti, è molto simile alla situazione con le stringhe Python fino a circa 2,6 o forse 2.5.)
Inoltre, ogni volta che ci assegniamo nums = nums.append(x)
saremmo Copia di un elenco che è in aumento in termini di dimensioni risultante nel comportamento quadratico. Per questi motivi vengono creati gli oggetti mutabili.
Una conseguenza di fare liste mutabile è che dopo queste dichiarazioni:
a = [1,2,3]
b = a
a.append(4)
lista b è cambiato a [1,2,3,4]
. Questo è qualcosa con cui viviamo anche se di tanto in tanto ci fa incazzare.
Che cosa esattamente circa un intero vorresti mormorare? I bit? –
Supponendo l'immutabilità di alcuni tipi consente tutti i tipi di ottimizzazioni. Queste ottimizzazioni sono _most_ pronunciate per 'str', ma entrano in gioco per' int', 'float',' tuple', 'frozenset' anche ... Alcuni probabilmente sostengono che l'immutabilità rende il codice più facile da leggere in molti anche le situazioni. Accoppia questo con il fatto che non esiste un modo naturale per mutare interi (diversi da '+ =', '* =', ... che sono abbastanza rari ...) e non sembra essere un buon motivo per non avere immutabili ints. – mgilson
Se è possibile modificare il valore '1' in' '2' e il valore' 2' in '' 1', '2 + 2 == 1' sarebbe' true'; è davvero quello che vuoi? –