2015-09-25 3 views
0

Несколько дней назад я прошу некоторую функцию, которая извлекает повторяющийся мотив из некоторой строки (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

См. Связанный обман. Вам нужно изменить 'l = []' на 'l = None', а затем каждый раз создавать новый пустой список. – tzaman

+0

Привет @tzaman, сменить 'l' было легко. Но что вы имеете в виду при создании нового пустого списка каждый раз? Где? –

+0

'if l is None: l = []' – tzaman

ответ

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 каждый раз.

+0

Это скорее комментарий, чем ответ. – Leb

+0

Ты рок, чувак! Но также важно сказать, что строка 'return finder (st [j:], past_ind)' должна быть изменена на 'return finder (st [j:], past_ind, l = l)' –

Смежные вопросы