Set e dizionari sono realizzati tramite le tabelle hash. Sono raccolte non ordinate, il che significa che non hanno un ordine garantito.
L'ordine visualizzato è un dettaglio di implementazione non garantito. Nel CPython, il valore hash per un intero è il numero intero in sé:
>>> [hash(i) for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Questo dettaglio di implementazione fa sì che gli interi ad apparire ordinata nel set. Altri set sarebbero semi-ordinati, {5, 6, 7, 8, 9}
appare come set([8, 9, 5, 6, 7])
.
Al contrario, altri tipi di dati come str hanno diverse funzioni hash e sembreranno più confusi. Per esempio:
# Example of scrambling str objects in a 64-bit build
>>> {'red', 'green', 'blue'}
set(['blue', 'green', 'red'])
Il metodo set.pop salta fuori le voci da sinistra a destra. Anche questo è un dettaglio di implementazione non garantito.
La risposta breve alla tua domanda è Sì, l'ordine è arbitrario ma No, ciò che hai visto non era solo una coincidenza, piuttosto era un dettaglio di implementazione non garantito interessante.
Spero che questo cancella-up il mistero per voi :-)
Questo ha a che fare con la funzione di hash che usa un set per mappare il suo contenuto di posizioni nella memoria. Prova a fare 'hash()' su diversi tipi di dati e vedere quali numeri ottieni. Il numero arbritrario estratto da un set _will_ è l'elemento _next_ nel set. Si dà il caso che "l'ordine" memorizzato nel set non possa essere ordinato n_necessariamente per quanto ti riguarda. In questo esempio, l'ordine in cui gli elementi si verificano coincidono con l'ordine in cui l'hashmap è memorizzata/recuperata. –
Ho trovato la stessa cosa oggi e voglio sollevare la tua domanda –