Le comprensioni stanno avendo alcune interazioni impreviste con l'ambito. È questo il comportamento previsto?
Ho un metodo:
def leave_room(self, uid):
u = self.user_by_id(uid)
r = self.rooms[u.rid]
other_uids = [ouid for ouid in r.users_by_id.keys() if ouid != u.uid]
other_us = [self.user_by_id(uid) for uid in other_uids]
r.remove_user(uid) # OOPS! uid has been re-bound by the list comprehension above
# Interestingly, it's rebound to the last uid in the list, so the error only shows
# up when len > 1
A rischio di piagnucolare, questa è una brutale fonte di errori. Mentre scrivo nuovo codice, solo occasionalmente trovo errori molto strani dovuti al rebinding, anche ora che so che è un problema. Devo fare una regola come "anteponi sempre le variabili temporanee nelle comprensioni di elenchi con un trattino basso", ma anche questo non è infallibile.
Il fatto che ci sia questa bomba a orologeria casuale in attesa in qualche modo nega tutta la piacevole "facilità d'uso" della comprensione delle liste.
for
costrutto -loop e for
-loops variabili perdite . Quindi non era esplicito ma era implicitamente affermato.