У понимания есть некоторые неожиданные взаимодействия с областью видимости. Это ожидаемое поведение?
У меня есть способ:
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
Рискуя ныть, это серьезный источник ошибок. Когда я пишу новый код, я просто иногда нахожу очень странные ошибки из-за повторной привязки - даже сейчас, когда я знаю, что это проблема. Мне нужно сделать правило вроде «всегда предварять временные переменные в понимании списка с подчеркиванием», но даже это не является надежным.
Тот факт, что есть случайное ожидание с бомбой замедленного действия, сводит на нет всю приятную «простоту использования» понимания списков.
for
переменным -loop и for
-loops для утечки . Так что это не было явным, но было заявлено неявно.