前几天我要求一些函数从一些字符串(Here the link to the ask)中检索重复的主题。用户@Kasramvd基于正则表达式发布了一个很好的函数:
import re
def finder(st,past_ind=0,l=[]):
m=re.search(r'(.+)\1+',st)
if m:
i,j=m.span()
sub=st[i:j]
ind = (sub+sub).find(sub, 1)
sub=sub[:ind]
if len(sub)>1:
l.append([sub,(i+past_ind+1,j+past_ind+1)])
past_ind+=j
return finder(st[j:],past_ind)
else:
return l
事实上,这个功能可以捕捉重复的图案并显示从/到它发生的位置:
>>> finder('123.123.123.')
[['123.', (1, 13)]] #the 123. motif take place from position 1 to position 13
然而,看起来这个函数有内存。当我再次使用其他字符串时,它也会显示以前的结果:
>>> finder('abc.abc.abc.')
[['123.', (1, 13)], ['abc.', (1, 13)]]
那么,有人知道如何避免这种情况吗?如何重置功能?
先谢谢你们。 =)
答案 0 :(得分:1)
Don't use mutable types for function defaults.
当你声明def finder(st,past_ind=0,l=[])
时,默认值是单个list
,它在函数的所有调用之间共享,不会覆盖默认值(并返回给调用者进行引导),所以在函数内或调用者对列表进行的任何突变都将更改将来调用的默认值。改为:
def finder(st,past_ind=0,l=None):
if l is None:
l = []
... rest of function ...
避免这个问题;在函数体中对l
的赋值每次都会创建一个新的list
。