Ho una domanda su come creare una sottolista (spero che questo sia il termine giusto da usare) da una lista data senza copiare.Python: creare una sottolista senza copiare
Sembra che l'affettatura possa creare sottoliste, ma lo fa con la copia. Ecco un esempio.
In [1]: a = [1,2,3]
In [2]: id(a)
Out[2]: 4354651128
In [3]: b = a[0:2]
In [4]: b
Out[4]: [1, 2]
In [5]: id(b)
Out[5]: 4354621312
In [6]: id(a[0:2])
Out[6]: 4354620880
Vedere qui l'id di b e [0: 2] sono diversi, sebbene i loro valori siano gli stessi. Per ricontrollare, cambiare il valore in a, il valore in b non cambia.
In [7]: a[1] = 4
In [8]: a
Out[8]: [1, 4, 3]
In [9]: b
Out[9]: [1, 2]
Quindi, per tornare alla mia domanda, come posso creare sottoliste ma senza copiare? Voglio dire, quando il valore di [1] è impostato su 4, b sarà [1, 4].
Ho cercato in giro e non ho trovato molto aiuto (forse non sto usando le parole chiave giuste). Grazie!
Modifiche:
Grazie a tutti per i vostri commenti e le risposte! Ecco cosa ho imparato.
- Non esiste un modo integrato in Python per creare una visualizzazione di un elenco (o per creare un elenco di sottotitoli senza copiare).
- Il modo più semplice per eseguire questa operazione è utilizzare la matrice numpy.
- Sebbene gamma NumPy ha limitazioni sul tipo di dati rispetto al listino, lo fa servire il mio scopo (ad attuare Quicksort senza memoria aggiuntiva)
Ecco lo stesso processo con serie NumPy.
In [1]: import numpy as np
In [2]: a = np.arange(1,4)
In [3]: a
Out[3]: array([1, 2, 3])
In [4]: b = a[0:2]
In [5]: b
Out[5]: array([1, 2])
In [6]: id(b)
Out[6]: 4361253952
In [7]: id(a[0:2])
Out[7]: 4361254032
In [8]: a[1] = 4
In [9]: a
Out[9]: array([1, 4, 3])
In [10]: b
Out[10]: array([1, 4])
Il problema con questo tipo di condivisione è la perdita di memoria: supponiamo che rappresenti un elenco di sezioni [a: b] utilizzando un riferimento all'elenco e i valori a e b. Quindi, anche se la sezione è molto piccola, impedisce che la lista venga raccolta dai dati inutili, il che potrebbe essere molto costoso. Ma ovviamente puoi definire una classe personalizzata per le sezioni di lista "simboliche" con la rappresentazione sopra. –
perché vuoi farlo? –
Penso che quello che stai descrivendo sia molto vicino al concetto di viste sugli array 'numpy'. Vedi [questo post SO e risposta] (http://stackoverflow.com/questions/4370745/view-onto-a-numpy-array) per qualche discussione sull'argomento. Si avverta però che gli array 'numpy' sono meno flessibili sui tipi di dati che possono contenere, rispetto ai tipici elenchi Python, quindi potrebbero non adattarsi al caso d'uso a seconda dei dati che si desidera includere. – zehnpaard