Comprehensions는 범위 지정과 예상치 못한 상호 작용을합니다. 이것이 예상되는 동작입니까?
방법이 있습니다.
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
루프 구조 및 for
루프 누출 변수 와 동일하다고 명시 합니다 . 그래서 그것은 명시 적이 지 않았지만 암시 적으로 명시되었습니다.