栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么列表推导会写入循环变量,而生成器却不会?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么列表推导会写入循环变量,而生成器却不会?

Python的创建者Guido van Rossum在写关于统一内置在Python 3中的生成器表达式时提到了这一点:

我们还对Python 3进行了另一项更改,以改善列表理解与生成器表达式之间的等效性。在Python
2中,列表理解将“循环”控制变量“泄漏”到周围的范围内:

x = 'before'a = [x for x in 1, 2, 3]print x # this prints '3', not 'before'

这是列表理解的原始实现的产物。
多年来,它一直是Python的“肮脏的小秘密”之一。它起初是一种有意的折衷,目的是使列表理解迅速变得盲目,虽然对于初学者来说这不是一个常见的陷阱,但它肯定偶尔会刺伤人们。
对于生成器表达式,我们无法执行此操作。生成器表达式是使用生成器实现的,生成器的执行需要单独的执行框架。因此,生成器表达式(特别是如果它们在短序列上进行迭代)比列表理解效率低。

但是,在Python 3中,我们决定通过使用与生成器表达式相同的实现策略来修复列表理解的“肮脏的小秘密”。因此,在Python
3中,上述示例(在修改为使用print(x):-之后)将打印“ before”,证明列表理解中的“ x”会暂时遮蔽但不会覆盖周围的“ x”范围。

因此,在Python 3中,您将不再看到这种情况。

有趣的是,Python 2中的 dict理解 也不会这样做。这主要是因为dict理解是从Python 3向后移植的,因此已经在其中进行了修复。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/638282.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号