Das Verständnis hat einige unerwartete Wechselwirkungen mit dem Umfang. Ist das das erwartete Verhalten?
Ich habe eine Methode:
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
Dies ist eine brutale Fehlerquelle. Während ich neuen Code schreibe, finde ich nur gelegentlich sehr seltsame Fehler aufgrund des erneuten Bindens - selbst jetzt, wo ich weiß, dass es ein Problem ist. Ich muss eine Regel wie "Temp-Vars in Listenverständnissen immer mit Unterstrich voranstellen" festlegen, aber selbst das ist nicht narrensicher.
Die Tatsache, dass diese zufällige Zeitbombe wartet, negiert die nette "Benutzerfreundlichkeit" des Listenverständnisses.
for
Konstrukt for
-loop und den Leckvariablen -loops entspricht . Es war also nicht explizit, sondern wurde implizit angegeben.