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 

上記の 2 つのコードの違いは何ですか? ありがとう..

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ます:

シーケンシャル コードとは、命令の出現順に、単一のスレッドによってアクセスされることを意味します。これは、単一のスレッドが特定の順序でのみコードを実行できることを意味します。したがって、それはシーケンシャルです。もう 1 つは同時実行コードです。複数のスレッドが同じコードに同期的にアクセスする可能性があります。マルチスレッドはセキュリティ上のリスクと不整合のリスクをもたらす可能性があるため、プログラミングには特別な注意が必要です。

あなたの例でmethod_a()は、プログラムのメインスレッドで実行しているため、呼び出す(使用する)前に存在する(定義される)必要があります。

注: ここでは、定義 (解釈時) と実行 (実行時) を区別する必要があります。Python は最初に解釈してから実行します... (LtWorf の回答を参照)。

于 2013-06-19T11:47:52.603 に答える
1

最初のケースでは、メソッドが作成される前に呼び出されるため、Python インタープリターはそれが存在しないと見なします...

しかし、2番目のケースでは、すでに作成されており(定義はpythonicの用語です)、呼び出されているため、pythonは正常に実行されます!

ここでもう 1 つ理解しておくべきことは、Python インタープリターはコードを上から下に解釈するということです。

于 2013-06-19T11:51:32.860 に答える