2010-07-17 24 views
0

在一个函数中,我需要执行一些需要我在函数内部调用函数的逻辑。我做了这个,如: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 

在功能方面,DFS,我使用搜索(根),则这是做了正确的方法是什么?

我得到一个错误:局部变量“搜索”任务

+1

如下所示,您需要调用上方的定义,就是这样。 我很好奇,是什么阻止你在调用者的范围之外编写该函数? – 2010-07-17 02:33:17

回答

2

代码中有很多神秘的bug。定义的顺序错误(假设你需要的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又一全球?大概是一套? (我从一些你Q的背面,你绝对想拥有一个closed字典,不设置记得,即使我认为,作为一种可能性......

 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

你没有身体对你的while循环。这可能会导致解析代码时出现问题。我还建议在使用本地函数定义之前先放置它,这样更容易遵循。

1

在调用之前定义搜索,或者在dfs之外定义搜索。