Понимание списка повторно связывает имена даже после области понимания. Это правильно?

У понимания есть некоторые неожиданные взаимодействия с областью видимости. Это ожидаемое поведение?

У меня есть метод:

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

Рискуя ныть, это серьезный источник ошибок. Когда я пишу новый код, я просто иногда нахожу очень странные ошибки из-за повторной привязки - даже сейчас, когда я знаю, что это проблема. Мне нужно создать правило вроде «всегда предварять временные переменные в понимании списков с подчеркиванием», но даже это не является надежным.

Тот факт, что есть случайное ожидание бомбы замедленного действия, сводит на нет всю приятную «простоту использования» "составных списков.

116
задан codeforester 20 February 2019 в 19:29
поделиться