2010-07-17 3 views
0

В функции мне нужно выполнить некоторую логику, которая требует от меня вызова функции внутри функции. То, что я сделал с этим, как:function in python

def dfs(problem): 
    stack.push(bache) 
    search(root)    
    while stack.isEmpty() != 0: 


    def search(vertex): 
    closed.add(vertex) 
    for index in sars: 
     stack.push(index) 
     return stack 

В функции, ДПП, я использую поиска (корень), это правильный способ сделать это?

Я получаю сообщение об ошибке: локальных переменных «поиска», на который ссылается перед тем назначением

+1

Как указано ниже, вам нужно определение над вызовом, вот и все. Мне любопытно, что мешает вам писать эту функцию вне сферы действия вызывающего? –

ответ

2

В вашем коде есть много загадочных ошибок. Неправильный порядок определения (при условии, вам нужна функция search, чтобы быть вложенными один) и уже наблюдается ошибка синтаксиса из пустого while цикла, но есть больше ...:

def dfs(problem): 
    stack.push(bache) 
    search(root)    

что bache , что такое stack, что такое root? Если они все глобальные переменные, то вы злоупотребляете глобалами - и, по-видимому, нигде никогда не используете аргумент problem (?!).

while stack.isEmpty() != 0: 

что это странно выглядящий метод isEmpty? IOW, какой тип stack (явно не список Python, и это довольно странно, так как они делают отличные стеки LIFO; -) ...? И что-нибудь сделает его пустым ...?

def search(vertex): 
    closed.add(vertex) 

... не говори мне: closedявляется еще одним глобальным? Предположительно, набор? (Я помню из нескольких ваших Qs назад, что вы абсолютно хотели иметь closed Dict, не установлен, хотя я предположил, что, как возможность ...

 for index in sars: 

... и что sars?!

 stack.push(index) 
     return stack 

, что странное «петля» - один, который выполняет ровно один раз, изменяя глобальную переменную, а затем сразу же возвращается, что глобальная переменная, не делая какой-либо из других шагов через петлю (?).Даже если это именно то, что вы имеете в виду (нажмите первый элемент sars, период) Я не рекомендую прятать его в псевдо-петле - это серьезно похоже на загадочную ошибку, которая просто ждет, чтобы случиться ;-).

1

Вы должны отменить отступ поиск функции. Как вы его настроили прямо сейчас, вы определяете свою функцию поиска как часть завершения вашего вызова dfs. Кроме того, инкапсуляция в классе поможет.

0
  1. вы должны определить функцию, прежде чем использовать его
  2. root, кажется, не будет доступны в Вашей области - убедитесь, что он достижим
1

То неправильный порядок. Попробуйте следующее:

def dfs(problem): 
    def search(vertex): 
     closed.add(vertex) 
     for index in sars: 
      stack.push(index) 
      return stack 

    stack.push(bache) 
    search(root)    
    while stack.isEmpty() != 0: 
0

У вас нет тела для вашего цикла. Вероятно, это вызывает проблемы при анализе кода. Я также предложил бы поставить определение локальных функций до того, как он будет использован, поэтому его легче следовать.

1

Определить поиск, прежде чем вы его вызываете, или определить его вне dfs.