You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python itertools.permutations存入变量后列表推导式行为差异疑问

问题解答

这是预期行为,不是Bug,核心原因和Python迭代器的特性直接相关:

  • permutations()返回的是迭代器对象,迭代器的本质是一次性遍历的生成器——遍历过一次后,内部指针就走到了末尾,再遍历不会返回任何元素。

  • 两段代码的差异拆解:

    1. 第一段代码中,每次循环都会调用permutations(l)生成全新的迭代器。外层循环每取出一个排列e1,内层循环都会重新生成一个完整的排列迭代器,所以能遍历出所有4种排列组合。
    2. 第二段代码里,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:43:14