Python itertools.permutations存入变量后列表推导式行为差异疑问
问题解答
这是预期行为,不是Bug,核心原因和Python迭代器的特性直接相关:
permutations()返回的是迭代器对象,迭代器的本质是一次性遍历的生成器——遍历过一次后,内部指针就走到了末尾,再遍历不会返回任何元素。两段代码的差异拆解:
- 第一段代码中,每次循环都会调用
permutations(l)生成全新的迭代器。外层循环每取出一个排列e1,内层循环都会重新生成一个完整的排列迭代器,所以能遍历出所有4种排列组合。 - 第二段代码里,
lp2是提前创建好的单个迭代器。当外层循环第一次取e1=(1,2)时,内层循环已经把lp2的所有元素(两个排列)遍历完毕,lp2直接被耗尽。当外层循环第二次取e1=(2,1)时,内层循环再去遍历lp2,这个迭代器已经没有元素可以输出,因此不会产生新的组合,最终只得到2个结果。
- 第一段代码中,每次循环都会调用
纠正你的猜测:
lp1和lp2是两个独立的迭代器(可以通过id(lp1)和id(lp2)查看内存地址验证),问题出在lp2被提前耗尽,而非指向同一个迭代器。修复方案:如果要复用排列结果,把迭代器转换成可重复遍历的列表即可:
from itertools import permutations l=[1,2] lp1 = list(permutations(l)) lp2 = list(permutations(l)) print([(e1, e2) for e1 in lp1 for e2 in lp2])
内容的提问来源于stack exchange,提问作者utyde
相关产品推荐
相关产品推荐

