Python iterpools.groupby(str):list(g)将在'if'语句中更改

Python iterpools.groupby(str):list(g)将在'if'语句中更改,python,Python,作为一个新手,我试着练习groupby的功能并看到结果。然而,我发现了一个奇怪的现象 str = 'hieeelalaooo' for k, g in groupby(str): print(list(k), list(g)) if True: print(list(k), list(g)) 结果显示,listg将在“if”语句中更改,如下所示: `['h'] ['h'] ['h'] [] ['i'] ['i'] [

作为一个新手,我试着练习groupby的功能并看到结果。然而,我发现了一个奇怪的现象

    str = 'hieeelalaooo'
    for k, g in groupby(str):
        print(list(k), list(g))
        if True:
            print(list(k), list(g))
结果显示,listg将在“if”语句中更改,如下所示:

`['h'] ['h']
 ['h'] []
 ['i'] ['i']
 ['i'] []
 ['e'] ['e', 'e', 'e']
 ['e'] []
 ....`

我就是搞不懂。依我的直觉,listg应该保持不变,而不是变成一个空列表。有人能解释一下这种变化的基本逻辑吗?非常感谢您的帮助。

发生这种情况的原因是g是一个迭代器,即groupby通过yield语句返回g的值。一旦您使用了该值,它就消失了,除非您将其分配给另一个变量,这是因为它不会将生成的值保留在内存中

您可以这样做:

str = 'hieeelalaooo'
    for k, g in groupby(str):
        k_ = k
        g_ = g
        print(list(k_), list(g_))
        if True:
            print(list(k_), list(g_))

有关更多信息,请查看:

在文档之后,变量的内容在生成后被释放。因此,如果你想保留这些值,你必须将它们存储在另一个变量中。g是一个迭代器,这意味着它有一个状态来记住它已经为第一个列表返回了哪些项,哪些项没有。这很有意义。非常感谢你!不客气,感谢您花时间将答案标记为正确,并对您的反馈进行评论,我们非常感谢您;新用户不多,所以需要花时间来做这件事。祝你一天愉快!