Python 为什么从itertools.permutation读取/解包数据会更改其属性/内容?

Python 为什么从itertools.permutation读取/解包数据会更改其属性/内容?,python,itertools,Python,Itertools,我试图使用itertools的置换功能,然后我注意到。如果我尝试从排列中解包/读取数据,它会更改一些属性信息 from itertools import permutations a = permutations('abc') print(('a', 'b', 'c') in a) for x in a: print(x) print(('a', 'b', 'c') in a) for x in a: print(x) 输出: 这是怎么发生的?我查看了官方网页,没有

我试图使用itertools的置换功能,然后我注意到。如果我尝试从排列中解包/读取数据,它会更改一些属性信息

from itertools import permutations

a = permutations('abc')


print(('a', 'b', 'c') in a)

for x in a:
    print(x)

print(('a', 'b', 'c') in a)

for x in a:
    print(x)
输出:

这是怎么发生的?我查看了官方网页,没有找到任何线索。
我的环境是pycharm和python 3.7.4

摆脱生成器并将输出转换为列表,因为比较已经消失,因为它已经使用了。permutation只是一个迭代器,当您使用一个值进行比较时,它会转移到下一个值

代码:

输出:

True
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
True
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

正如其他人所说,问题在于a不是一个列表,而是一个生成器;也就是说,一个序列在你迭代它时会被用完——因此你只能在它上面迭代一次

如果你仔细观察,你会发现你的第一个打印循环只打印了六个排列中的五个;当您将第一个排列与第一个打印语句中的“a”、“b”、“c”进行核对时,第一个排列消失了。for循环然后打印出剩下的内容,剩下的代码试图从空杯子中喝水

要获得您期望的行为,请在如下列表中创建一个:

a = list(permutations('abc'))

当你有机会的时候,阅读生成器、迭代器和理解;它们在Python中随处可见,通常隐藏在显而易见的地方,而且它们非常棒。

置换,就像itertools中的其他内容一样,返回一个迭代器。您在first-in检查中使用了该迭代器中的一些元素,然后在first-for循环中使用了其余的所有元素。此时,迭代器为空。@jasonharper解释得非常清楚,谢谢
True
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
True
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
a = list(permutations('abc'))