Una comprensione del dizionario è espressiva nel senso che, usando uno, stai esprimendo che il tuo intento è quello di creare un dizionario. Puoi sempre fare la stessa cosa in un ciclo for, ma farlo non esprime questo intento. È qualcosa che il lettore deve determinare tramite l'ispezione del codice. Quindi considera questo:
cache = {key:lookup(key) for key in keystore}
Ora confronta con una versione senza una comprensione del dizionario:
cache = {}
for key in keystore:
cache[key] = lookup(key)
La prima versione è un po 'più compatta. Ma ancora più importante, esprime direttamente che il tuo intento è creare un dizionario. Nella versione per loop, devi leggere il codice e vedere che questo è il risultato.
L'altro punto da considerare è che una versione di comprensione del dizionario è intrinsecamente più semplice di una versione per loop. Una comprensione del dizionario non può fallire nel produrre un dizionario. Ci sono una serie di errori che potresti potenzialmente fare nella versione per ciclo che non può verificarsi nella comprensione del dizionario.
Ecco un esempio di come una comprensione potrebbe aiutare a evitare un difetto:
cache = {}
for key in keystore:
cache[key] = lookup(key)
cache2 = {}
for key in keystore2:
cache[key] = lookup(key) # oops
Abbiamo deciso di utilizzare una seconda cache, ma quando abbiamo copiato la copia, abbiamo introdotto un difetto. Ora guarda la versione di comprensione del dizionario:
cache = {key:lookup(key) for key in keystore}
cache2 = {key:lookup(key) for key in keystore2}
Poiché cache
viene visualizzato due volte nella versione del ciclo for
, è possibile che queste due istanze risultino disallineate. Questo è impossibile con la comprensione del dizionario perché il dizionario di destinazione appare solo una volta.
So che questo esempio sembra banale, ma nel mondo reale, con un codice più complesso (ad esempio, se si ha una clausola if / else), questo problema peggiora.