内包には、スコーピングとの予期しない相互作用がいくつかあります。これは予想される動作ですか?
私はメソッドを持っています:
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
泣き言を言うリスクがあるので、これは残忍なエラーの原因です。新しいコードを書いていると、再バインドが原因で非常に奇妙なエラーがときどき見つかります。「リスト内包表記のtemp varは常にアンダースコアで始まる」というルールを作成する必要がありますが、それでも絶対に確実なわけではありません。
このランダムな時限爆弾の待機の種類があるという事実は、リスト内包のすべての優れた「使いやすさ」を無効にします。
for
構文およびfor
-loopsリーク変数と同等であると記載されています。したがって、それは明示的ではなく、暗黙的に述べられていました。