2013-11-27 2 views
1

Я довольно новичок в python, и в качестве упражнения я написал простую функцию обратного вызова.python неожиданно AttributeError

код:

def m_reverse(x): 
    if len(x) == 1: 
      return x 
    return m_reverse(x[:-1]).insert(0,x[-1]) 

, когда я пытаюсь его я получаю следующее:

>>> m_reverse([1,2,3,4]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in m_reverse 
    File "<stdin>", line 4, in m_reverse 
AttributeError: 'NoneType' object has no attribute 'insert' 

, что моя ошибка? Какие-то критические данные мне не хватает?

+0

В качестве примечания: Поскольку '[х] [: -1] 'является законным (и возвращает пустой список), вы можете использовать пустой список в качестве базового аргумента вместо' len (x) == 1'. Это сделало бы ваш код немного более простым, а также заставил бы его работать с пустыми списками вместо того, чтобы создавать исключение. См. [Здесь] (http://pastebin.com/RFED74p0) для примера (с включенным исправлением пользователя mgilson). – abarnert

ответ

3

с встроенными функциями python, если функция мутирует аргумент на месте, по соглашению возвращает None. Итак, поскольку .insert мутирует список, он возвращает None.

Ваша идея хороша, и я думаю, что логика имеет смысл - с точки зрения его реализации, а не с помощью insert, вы можете использовать список конкатенации:

def m_reverse(lst): 
    if len(lst) == 1: 
     return lst 
    else: 
     return [lst[-1]] + m_reverse(lst[:-1]) 
     # return lst[-1:] + m_reverse(lst[:-1]) would also work. 
+0

любые функции неразрушения, которые будут делать то же самое? что-то вроде lisps cons? – elyashiv

+0

@elyashiv - разработчик может делать все, что захочет. Я просто говорю, что такое * обычный *. Есть несколько примечательных исключений. 'list.pop' и' dict.pop' являются двумя такими исключениями. – mgilson

+0

@mgilson: Соглашение заключается в том, что методы mutating не возвращают 'self', а не то, что они ничего не возвращают. Поскольку 'pop' имеет что-то полезное для возврата (всплывающее значение), он возвращает это. Поскольку 'insert' не имеет ничего полезного для возврата, он возвращает' None'. – abarnert