2

当我使用以下方式调用该函数时,

method_a()
def method_a():

    print "I am method A"

我从上面的代码中得到一个错误,

Traceback (most recent call last):
  File "class1.py", line 1, in <module>
    method_a()
NameError: name 'method_a' is not defined

当我按照以下方式调用函数时,

def method_a():

    print "I am method A"

method_a()

我得到了正确的输出,上面的代码没有任何错误

I am method A 

以上两个代码有什么区别?谢谢..

4

4 回答 4

10

Python 从上到下执行源文件。该方法在def method_a(): ...执行之前没有定义,它会创建它。

于 2013-06-19T11:39:43.013 回答
2

它是这样工作的:

call_function() #Looks up in the dictionary of all the functions and executes it.

def call_function(): #Adds the function to the dictionary of all functions
    print "a"

这意味着您不能在定义函数之前调用它。但是如果你从另一个函数调用一个函数呢?

def f1():
    f2()

def f2():
    print "a"

为什么这行得通?

它之所以有效,是因为当您定义 f1 时,它并没有执行,只是添加了,所以只有当您尝试执行它时,才会在字典中搜索 f2,在这种情况下,它会在那里,因为它是在之后定义的。

于 2013-06-19T12:19:30.813 回答
1

在您的情况下(Python +主线程),代码被执行sequentially

顺序代码意味着它由单个线程按照指令出现的顺序访问。这意味着单个线程只能按特定顺序执行代码,因此它是顺序的。另一件事是并发代码,多个线程可以同步访问相同的代码。编程需要特别小心,因为多线程可能会带来安全风险和不一致风险。

在您的示例中,method_a()在调用(使用)它之前必须存在(定义),因为您在程序的主线程中运行。

注意:在这里您必须区分定义(在解释时)和执行(在运行时)。Python 首先解释,然后执行......(参见 LtWorf 的回答)。

于 2013-06-19T11:47:52.603 回答
1

在第一种情况下,该方法在创建之前被调用,因此 python 解释器认为它不存在......

但在第二种情况下,它已经被创建(虽然定义是pythonic术语)然后被调用,所以python成功地执行了它!

这里要理解的另一件事是python解释器从上到下解释代码

于 2013-06-19T11:51:32.860 回答