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

列表理解中for语句的顺序

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

列表理解中for语句的顺序

for
列表推导中的循环始终以 嵌套顺序
列出。您可以使用相同的嵌套顺序将两个理解都写成常规循环。请记住,只有第一个表达式之前的表达式
for
会产生最终值,因此请将其放入循环中。

因此

[i for x in ['b', 'c'] for i in ['a', x]]
变为:

for x in ['b', 'c']:    for i in ['a', x]:        i  # added to the final list

[i for i in ['a', x] for x in ['b', 'c']]
成为:

for i in ['a', x]:    for x in ['b', 'c']:        i

如您所见,如果不先定义

x
列表理解之外, 第二个版本将无法运行,因为否则将
['a', x]
无法创建列表。另请注意,否则将
忽略
x
for内循环。您得到的一切都是重复的。内循环中该列表中的值是什么无关紧要, 循环 的长度不再重要
for x in ['b','c']
i

在您的情况下,将

x = 'c'
首先设置来解释您的输出;然后获得
for i in ['a','c']
外循环,内循环重复两次,因此
'a'
被添加了两次,然后
i = 'c'
被设置,并且被
'c'
添加了两次。

碰巧的是,在Python 2中,变量在列表理解“泄漏”中使用,就像在常规

for
循环泄漏中使用的变量一样;使用后
for x in ['b', 'c']:pass
x
将保持可用并绑定到
'c'
。这是您的
x = 'c'
来源:

>>> [i for x in ['b', 'c'] for i in ['a', x]]['a', 'b', 'a', 'c']>>> i'c'>>> x'c'>>> [i for i in ['a', x] for x in ['b', 'c']]['a', 'a', 'c', 'c']

i
x
反映它们的最后绑定对象,因此在第一个( 外部 )循环迭代时运行下一个列表理解
['a', 'c']

x
从全局变量中删除,第二个列表理解就无法运行:

>>> del x>>> [i for i in ['a', x] for x in ['b', 'c']]Traceback (most recent call last):  File "<stdin>", line 1, in <module>NameError: name 'x' is not defined

for
上面的完整常规循环版本也会发生同样的情况:

>>> for i in ['a', x]:...     for x in ['b', 'c']:...         i... Traceback (most recent call last):  File "<stdin>", line 1, in <module>NameError: name 'x' is not defined>>> x = 'foo'>>> for i in ['a', x]:...     for x in ['b', 'c']:...         i... 'a''a''foo''foo'

在Python 3中,列表推导在新的范围内执行(就像生成器表达式,dict推导和set推导已在Python 2中一样)。



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

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

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