Python difflib在某些输入上产生奇怪的结果

时间:2018-01-21 22:07:40

标签: python diff difflib

我正在测试difflib如何为每个字符区分一些随机输入而工作,并且惊讶地发现以下内容:

考虑一个片段:

import difflib

a = """kydropqfp
tpssubdbw tzibqyqvp llmpwtekn xmubmrjch vcojgxxil
vdrsqhzag xlcldqabb ujccweoha dsooqyyve khilgzjue
jignrbela glvvueqqb qlfehmlkm brkleswiq vvsplffjf
yjuoivyjr wtfueypmo pkvlmbcnh tesuistya zbf"""

blist = list(a)
blist[23] = 'a'
b = ''.join(blist)

print('\n'.join(difflib.unified_diff(a, b)))

它提供了预期的结果:

--- 

+++ 

@@ -21,7 +21,7 @@

 t
 z
 i
-b
+a
 q
 y
 q

但是,如果我们在输入的末尾只添加一个n字符:

a = """kydropqfp
tpssubdbw tzibqyqvp llmpwtekn xmubmrjch vcojgxxil
vdrsqhzag xlcldqabb ujccweoha dsooqyyve khilgzjue
jignrbela glvvueqqb qlfehmlkm brkleswiq vvsplffjf
yjuoivyjr wtfueypmo pkvlmbcnh tesuistya zbfn"""

然后,由于某种原因,找到差异之后的上下文不限于3个字符:

--- 

+++ 

@@ -21,184 +21,184 @@

 t
 z
 i
-b
-q
-y
-q
-v
-p
- 
-l
-l
-m
-p
-w
-t
-e
-k
-n
- 
-x
-m
-u
-b
-m
-r
-j
-c
-h
- 
-v
-c
-o
-j
-g
-x
-x
-i
-l
-

-v
-d
-r
-s
-q
-h
-z
-a
-g
- 
-x
-l
-c
-l
-d
-q
-a
-b
-b
- 
-u
-j
-c
-c
-w
-e
-o
-h
-a
- 
-d
-s
-o
-o
-q
-y
-y
-v
-e
- 
-k
-h
-i
-l
-g
-z
-j
-u
-e
-

-j
-i
-g
-n
-r
-b
-e
-l
-a
- 
-g
-l
-v
-v
-u
-e
-q
-q
-b
- 
-q
-l
-f
-e
-h
-m
-l
-k
-m
- 
-b
-r
-k
-l
-e
-s
-w
-i
-q
- 
-v
-v
-s
-p
-l
-f
-f
-j
-f
-

-y
-j
-u
-o
-i
-v
-y
-j
-r
- 
-w
-t
-f
-u
-e
-y
-p
-m
-o
- 
-p
-k
-v
-l
-m
-b
-c
-n
-h
- 
-t
-e
-s
-u
-i
-s
-t
-y
-a
- 
-z
-b
-f
-n
+a
+q
+y
+q
+v
+p
+ 
+l
+l
+m
+p
+w
+t
+e
+k
+n
+ 
+x
+m
+u
+b
+m
+r
+j
+c
+h
+ 
+v
+c
+o
+j
+g
+x
+x
+i
+l
+

+v
+d
+r
+s
+q
+h
+z
+a
+g
+ 
+x
+l
+c
+l
+d
+q
+a
+b
+b
+ 
+u
+j
+c
+c
+w
+e
+o
+h
+a
+ 
+d
+s
+o
+o
+q
+y
+y
+v
+e
+ 
+k
+h
+i
+l
+g
+z
+j
+u
+e
+

+j
+i
+g
+n
+r
+b
+e
+l
+a
+ 
+g
+l
+v
+v
+u
+e
+q
+q
+b
+ 
+q
+l
+f
+e
+h
+m
+l
+k
+m
+ 
+b
+r
+k
+l
+e
+s
+w
+i
+q
+ 
+v
+v
+s
+p
+l
+f
+f
+j
+f
+

+y
+j
+u
+o
+i
+v
+y
+j
+r
+ 
+w
+t
+f
+u
+e
+y
+p
+m
+o
+ 
+p
+k
+v
+l
+m
+b
+c
+n
+h
+ 
+t
+e
+s
+u
+i
+s
+t
+y
+a
+ 
+z
+b
+f
+n

有没有人对这种行为有解释?

1 个答案:

答案 0 :(得分:0)

在Python 2.7.10中,我在print('\n'.join(difflib.unified_diff(a, b)))print('\n'.join(difflib.unified_diff(b, a)))之间得到了截然不同的结果(ab交换过来了:

>>> a = """kydropqfp
... tpssubdbw tzibqyqvp llmpwtekn xmubmrjch vcojgxxil
... vdrsqhzag xlcldqabb ujccweoha dsooqyyve khilgzjue
... jignrbela glvvueqqb qlfehmlkm brkleswiq vvsplffjf
... yjuoivyjr wtfueypmo pkvlmbcnh tesuistya zbfn"""
>>> print('\n'.join(difflib.unified_diff(a, b)))
--- 

+++ 

@@ -21,7 +21,7 @@

t
z
i
-b
+a
q
y
q
@@ -201,4 +201,3 @@

z
b
f
-n
>>> print('\n'.join(difflib.unified_diff(b, a)))
--- 

+++ 

@@ -21,183 +21,184 @@

t
z
i
-a
-q
-y
-q
-v
-p
- 
-l
-l
-m
-p
-w
-t
-e
-k
-n
- 
-x
-m
-u
-b
-m
-r
-j
-c
-h
- 
-v
-c
-o
-j
-g
-x
-x
-i
-l
-

-v
-d
-r
-s
-q
-h
-z
-a
-g
- 
-x
-l
-c
-l
-d
-q
-a
-b
-b
- 
-u
-j
-c
-c
-w
-e
-o
-h
-a
- 
-d
-s
-o
-o
-q
-y
-y
-v
-e
- 
-k
-h
-i
-l
-g
-z
-j
-u
-e
-

-j
-i
-g
-n
-r
-b
-e
-l
-a
- 
-g
-l
-v
-v
-u
-e
-q
-q
-b
- 
-q
-l
-f
-e
-h
-m
-l
-k
-m
- 
-b
-r
-k
-l
-e
-s
-w
-i
-q
- 
-v
-v
-s
-p
-l
-f
-f
-j
-f
-

-y
-j
-u
-o
-i
-v
-y
-j
-r
- 
-w
-t
-f
-u
-e
-y
-p
-m
-o
- 
-p
-k
-v
-l
-m
-b
-c
-n
-h
- 
-t
-e
-s
-u
-i
-s
-t
-y
-a
- 
-z
-b
-f
+b
+q
+y
+q
+v
+p
+ 
+l
+l
+m
+p
+w
+t
+e
+k
+n
+ 
+x
+m
+u
+b
+m
+r
+j
+c
+h
+ 
+v
+c
+o
+j
+g
+x
+x
+i
+l
+

+v
+d
+r
+s
+q
+h
+z
+a
+g
+ 
+x
+l
+c
+l
+d
+q
+a
+b
+b
+ 
+u
+j
+c
+c
+w
+e
+o
+h
+a
+ 
+d
+s
+o
+o
+q
+y
+y
+v
+e
+ 
+k
+h
+i
+l
+g
+z
+j
+u
+e
+

+j
+i
+g
+n
+r
+b
+e
+l
+a
+ 
+g
+l
+v
+v
+u
+e
+q
+q
+b
+ 
+q
+l
+f
+e
+h
+m
+l
+k
+m
+ 
+b
+r
+k
+l
+e
+s
+w
+i
+q
+ 
+v
+v
+s
+p
+l
+f
+f
+j
+f
+

+y
+j
+u
+o
+i
+v
+y
+j
+r
+ 
+w
+t
+f
+u
+e
+y
+p
+m
+o
+ 
+p
+k
+v
+l
+m
+b
+c
+n
+h
+ 
+t
+e
+s
+u
+i
+s
+t
+y
+a
+ 
+z
+b
+f
+n
>>> 

difflibstrange parts。使用的算法是一个旧的,试图“看起来很好”,但显然有些情况下它不起作用。我没有查看代码告诉你为什么它的行为是这样的,但我希望这能告诉你内置的difflib是好的,但不是最好的。不幸的是,似乎没有受支持的alternatives