2016-09-17 6 views
1

Я работаю над некоторыми алгоритмами поиска пути, и нижеприведенный фрагмент должен сделать массив узлов на пути от цели до начала. Он отлично работает, когда есть путь от цели к началу. Но когда нет пути от начала до цели, цикл while никогда не запускается, и результат возвращается как [] (что верно).Почему пустой список становится NoneType при возврате?

def path(goal, pathToParentLookup): 
    currentNode = goal 
    result = [] 
    while(currentNode in pathToParentLookup): 
     currentNode = pathToParentLookup[currentNode] 
     result.append(currentNode) 

    return result 

#bidirectional search from start to goal finds the mid point of "center" 
start_path = path(center, pathBack_start).reverse() 
goal_path = path(center, pathBack_goal) 
return start_path + [center] + goal_path 

Однако я получаю эту ошибку:

<ipython-input-14-ca3cb26b31ce> in bidirectional_search(graph, start, goal, searchMethod) 
    46    start_path = path(center, pathBack_start).reverse() 
    47    goal_path = path(center, pathBack_goal) 
---> 48    return start_path + [center] + goal_path 
    49 
    50 

TypeError: can only concatenate list (not "NoneType") to list 

ответ

3

Это не то, что происходит. Проблема в том, что на line 46 вы назначаете start_path результат вызова reverse() в списке, возвращаемого path(). Это нормально, но так как [].reverse() всегда возвращает None, я уверен, что это не то, что вы намеревались.

То, что я думаю, что вы хотите, это:

#bidirectional search from start to goal finds the mid point of "center" 
start_path = path(center, pathBack_start) 
start_path.reverse() 
goal_path = path(center, pathBack_goal) 
return start_path + [center] + goal_path 
+0

Или же, так как стоимость копии компенсируется дешевизной нарезки на основе синтаксиса (по сравнению с более высокой стоимостью вызова метода), вы можете сохранить его в один вкладыше с 'start_path = path (center, pathBack_start) [:: - 1]' – ShadowRanger

+0

Я чувствую себя глупо, я пропустил это. благодаря –

1

Поскольку обратное является Inplace операция с типом None возврата.

x = [1, 2] 
print(x) 
[1, 2] 
a = x.reverse() 
print(a) 
None 
print(x) 
[2, 1] 

Не назначайте start_path к результату реверса. Назначьте его start_path = path (center, pathBack_start), а затем вызовите start_path.reverse()

0

[].reverse() возвращает None, вы не должны назначать возвращаемое значение, потому что оно изменяет список на месте.

См ниже:

Python 2.7.11 (default, Dec 5 2015, 14:44:53) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print [].reverse() 
None 
>>> 
Смежные вопросы