理解与范围界定存在一些意外的相互作用。这是预期的行为吗?
我有一个方法:
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 vars开头”,但是即使这样也不是万无一失的。
这种随机定时炸弹等待的事实否定了列表推导的所有“易用性”。
for
-loop构造和for
-loops泄漏变量。因此它不是显式的,而是隐式声明的。