2010-08-25 122 views
0

我不知道该怎么称呼它,所以如果有人想编辑它:继续。Python定义依赖于其他未定义的定义?

def Function_A() 
print "We're going to function B!" 
Function_B() 

def Function_B() 
print "We made it!' 

这是一个初学者的问题,但解决方案并没有发生在我身上,因为我被编译语言宠坏了。你可以在这里看到,Function_A通向Function_B。在运行时,函数_A被调用时,函数_B将不会被定义,所以它不会发生。我如何解决这个问题?

+0

顺便说一句,我知道我可以把Function_B以上Function_A。但是,假设我有三个功能都相互依赖。移动一个函数永远不会停止,它永远不会工作。这是我的问题。大声笑 – Reznor 2010-08-25 21:56:37

回答

5

在Python中,函数不需要按使用顺序进行定义。只要它在函数调用运行时之前的某个地方定义,它应该可以工作。这是因为Function_A()实际上并没有被调用,直到它被调用,在这种情况下是在这个test.py文件的底部,在这一点上Function_B()已经被定义。

test.py:

def Function_A(): 
    print "We're going to function B!" 
    Function_B() 

def Function_B(): 
    print "We made it!!" 

Function_A() 

实例运行:

mahmoud:~$ python test.py
We're going to function B!
We made it!!

+0

我想在你调用'Function_A()'的时候去掉分号。这在技术上是合法的,但它看起来不太pythonic。除此之外,答案是完全正确的,所以+1。 – 2010-08-25 22:05:45

+0

糟糕,固定。谢谢。 – Mahmoud 2010-08-25 22:16:22

1

你有两个问题,我可以看到。一,def后需要冒号。二:你在最后一个字符串上混合了打开/关闭引号。

def Function_A(): 
print "We're going to function B!" 
Function_B() 

def Function_B(): 
print "We made it!" 

否则,此代码将按照发布的方式工作。运行这些功能我没有问题。

2

函数名在运行时解析。因此,当Function_A调用Function_B时,只有在Function_A实际进行调用之前,才会查找名称“Function_B”。因此,只要Function_B由Function_A实际调用的时间定义,一切正常。这一点,例如,将工作:

def Function_A(): 
    print "Function A entered" 
    Function_B() 

Function_A() 

def Function_B(): 
    print "Function B entered" 

...因为调用Function_A是Function_B的定义之前。

2

正如所写,两个函数都被定义了,但是这两个函数都没有被调用。

如果你打电话Function_AFunction_B的定义,你会得到一个错误:如果你调用Function_AFunction_B一切的定义将正常工作

def Function_A(): 
print "We're going to function B!" 
Function_B() 

Function_A() # will fail 

def Function_B(): 
print "We made it!" 

def Function_A(): 
print "We're going to function B!" 
Function_B() 

def Function_B(): 
print "We made it!" 

Function_A() # will succeed 

解释器从头到尾执行文件,定义和调用函数。只有在函数被调用时才会仔细观察函数体。

执行Function_A并到达第二行时,解释器将查找全局名称空间以查找名为Function_B的东西。在第一个例子中,还没有定义任何东西,而在第二个例子中有一个可以调用的Function_B

2

正如其他人所说的,当调用Function_A时,会查找Function_B。下面是一个示例,显示Function_B甚至可以重新定义并仍然正常工作。

def Function_A(): 
    print "We're going to function B!" 
    Function_B() 

# Function_A() # This would cause a NameError 

def Function_B(): 
    print "We made it!" 

Function_A() 

def Function_B(): 
    print "Function B has been redefined!" 

Function_A() 

输出:

We're going to function B!
We made it!
We're going to function B!
Function B has been redefined!