Zrozumienia mają nieoczekiwane interakcje z określaniem zakresu. Czy to jest oczekiwane zachowanie?
Mam metodę:
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
Ryzykując marudzenie, jest to brutalne źródło błędów. Kiedy piszę nowy kod, od czasu do czasu znajduję bardzo dziwne błędy spowodowane ponownym wiązaniem - nawet teraz, gdy wiem, że to problem. Muszę utworzyć regułę typu „zawsze poprzedzać zmienne tymczasowe w listach składanych z podkreśleniem”, ale nawet to nie jest niezawodne.
Fakt, że czeka na nas ta losowa bomba zegarowa, w pewnym sensie neguje całą przyjemną „łatwość użycia” składania list.
for
-loop konstruktem i for
-loops zmienne wycieków . Nie było to więc wyraźne, ale zostało to stwierdzone w sposób dorozumiany.