2016-06-12 1 views
1

Ich weiß, dass in Python alle Funktionen definiert sein müssen, bevor irgendwelche verwendet werden. So wird dieser Code in einem Fehler:Aufruf einer Funktion vor der Deklaration seines Rumpfes in Python 3.x

hello() 
def hello(): 
    print('Hi!') 

Aber in einem Code wie das Gebrüll:

def func(): 
    hello() 

def hello(): 
    print('Hi!') 

func() 

Die hallo() Funktion von func() aufgerufen wird, bevor sie definiert ist und es funktioniert immer noch und ich verstehe nicht warum.

So können Sie bitte das obige Verhalten erklären und danke im Voraus.

+0

Die Funktion muss zu * Anrufzeit * definiert werden, nicht zur * Definitionszeit * anderer Funktionen. – deceze

Antwort

3

Python ist eine interpretierte Sprache, daher wird es interpretiert Zeile für Zeile,

Sowohl Ihre Beispiele der gleichen Logik folgen,

in der zweiten,

func und hello bereits interpretiert Wenn Sie also func() anrufen, sind beide bekannt und werden ausgeführt.

def func(): 
    hello() 

-> Auf dieser Ebene func bekannt ist, aber nicht ausgeführt (genannt) noch

def hello(): 
    print('Hi!') 

-> Auf dieser Ebene beide func und hallo sind bekannt, aber nicht ausgeführt noch (so genannten)

func() 

-> Schließlich, wenn Sie anrufen func, egal in welcher Reihenfolge func und hello sind. Sie sind bekannt und haben eine Adresse im Speicher.

+0

Danke Mann. Ich habe es jetzt – user3885884

+0

@ user3885884 sicher! Sie können die Frage als gelöst markieren. – YOBA

3

Die Definition einer neuen Funktion führt sie nicht aus. Daher wird die hello()-Funktion nur aufgerufen, wenn Sie func() aufrufen, was nach dem Definieren von hello() erfolgt.

0

Ich denke, das ist, weil Python-Code von oben nach unten geparst wird, und wenn der Interpreter einen Funktionsaufruf sieht, muss es sofort ausführen, wenn es (noch) nicht definiert ist, wird dies ein Fehler sein .

Auf der anderen Seite, wenn diese Funktion jetzt nicht genannt wird, aber der Anruf erscheint in einer Definition einer anderen Funktion ‚sagt‘ der Interpret: „Okay, es sollte eine Funktion hello genannt werden, so Ich werde danach suchen. " Wenn es gefunden wird, ist es OK, sonst ist es ein Fehler.