理解与范围界定有一些意想不到的互动。这是预期的行为吗
我有一个方法:
def离开房间(自身、uid):
u=自用户id(uid)
r=自助房间[u.rid]
other_uid=[ouid for ouid in r.users_by_id.keys()如果ouid!=u.uid]
other\u-us=[self.user\u by\u-id(uid)表示其他uid中的uid]
r、 删除用户(uid)#哦!uid已被上面的列表重新绑定
#有趣的是,它会反弹到列表中的最后一个uid,因此错误只会显示出来
#当len>;1.
冒着抱怨的风险,这是一个残酷的错误来源。在编写新代码时,我只是偶尔会发现由于重新绑定而导致的非常奇怪的错误——即使现在我知道这是一个问题。我需要制定一个规则,比如“在列表理解中始终使用下划线作为临时变量的前缀”,但即使这样也不是傻瓜式的
事实上,这个随机定时炸弹的等待否定了所有列表理解的“易用性”
列表理解泄漏了Python2中的循环控制变量,而不是Python3中的循环控制变量。下面是Guido van Rossum(Python的创建者)解释这背后的历史:
我们还在Python中做了另一个更改
3、提高列表之间的等价性
理解与生成
表达。在Python2中,列表
理解“泄漏”循环控制
变量进入周围范围:x='before' a=[x代表1,2,3中的x] 打印x#此打印“3”,而不是“之前”这是原作的一件艺术品
清单理解的实施;
这是Python的“肮脏的小游戏”之一
“秘密”多年。一开始是
为列入名单而有意作出的妥协
理解速度快得令人眼花缭乱
虽然这不是一个常见的陷阱
初学者,它肯定会刺痛人
偶尔地发电机
我们不能这样做。
实现了生成器表达式
使用生成器,其执行
需要一个单独的执行框架。
因此,生成器表达式
(尤其是当它们在
短序列)的效率较低
而不是列出理解然而,在Python3中,我们决定
修复列表中的“肮脏小秘密”
用同样的方法理解
实施策略
生成器表达式。因此,在Python中
3、上述示例(在
修改使用打印(x):-)将
打印“之前”,证明“x”
在列表中
阴影,但不覆盖“x”
在周边范围内