Differ.compare() 的结果在使用一次后消失

Result of Differ.compare() vanishes after using once

我试图通过使用 Differ class 中 difflib 中定义的 compare(a,b) 方法的结果来描述两个字符串之间的差异 python .我按以下方式使用 compare(a,b)

s1 = ["one",  "three", "twoo"]
s2 = ["one",  "tow", "tree"]
d = difflib.Differ()
result = d.compare(s1, s2)

# without this for loop, the result is as expected
for r in result:
    print(r)

desc = describe_diff(result)
for k, value in desc.items():
    print(k, value)

我的问题是当我在将 result 传递给我创建的函数 describe_diff 之前打印它时,结果是错误的。但是当我注释掉打印 result 的 for 循环时,输出正常。我曾尝试使用两个 for 循环一个接一个地打印 result,但它只打印一次。但是,当我在两个循环之间(或打印循环和我的 describe_diff 函数调用之间)插入 compare(s1,s2) 时,一切都很好。因此,要多次使用 result 的值,我是否必须每次都执行 compare 方法?必须有一些方法来解决这个问题。请帮助。

那是因为compare给了你一个生成器对象,遍历一次就会耗尽。如果您想多次使用结果,可以将生成器转换为列表。

生成器将在一次迭代后为空:

>>> from difflib import Differ
>>> s1 = ["one",  "three", "twoo"]
>>> s2 = ["one",  "tow", "tree"]
>>> result = Differ().compare(s1, s2)
>>> result
<generator object compare at 0x7f017de9f1b0>
>>> for x in result:
...     pass
... 
>>> list(result)
[]

将生成器转换为列表(在对其进行迭代之前):

>>> result = Differ().compare(s1, s2)
>>> list(result)
['  one', '+ tow', '- three', '?  -\n', '+ tree', '- twoo']

注意你把生成器投到列表后,会再次耗尽:

>>> result = Differ().compare(s1, s2)
>>> foo = list(result) # foo is now ['  one', '+ tow', '- three', '?  -\n', '+ tree', '- twoo']
>>> list(result)
[]