1. Bereich auf Blockebene
Gibt es zu diesem Zeitpunkt eine Ausgabe, wenn das folgende Programm ausgeführt wird? Wird die Umsetzung erfolgreich sein?
#块级作用域 if 1 == 1: name = "lzl" print(name) for i in range(10): age = i print(age)
Werfen wir zunächst einen Blick auf die Ausführungsergebnisse
C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py lzl 9 Process finished with exit code 0
Der Code wurde erfolgreich ausgeführt und es gibt kein Problem; In Java/C# weist die Ausführung des obigen Codes darauf hin, dass Name und Alter nicht definiert sind, aber er kann in Python erfolgreich ausgeführt werden. Dies liegt daran, dass es in Python keinen Bereich auf Blockebene gibt extern aufgerufen, damit es erfolgreich ausgeführt werden kann
2. Rückblick auf das Wissen, das wir gelernt haben Bevor wir Funktionen lernen, ist die Funktion ein separater Bereich. In Python gibt es keinen Bereich auf Blockebene, aber einen lokalen Bereich. Schauen Sie sich den folgenden Code an
#Lokaler Bereich
Führen Sie den Code dieses Abschnitts aus und überlegen Sie, ob eine Ausgabe erfolgt?
def func(): name = "lzl" print(name)
Traceback (most recent call last): File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module> print(name) NameError: name 'name' is not defined
#局部作用域 def func(): name = "lzl" func() #执行函数 print(name)
Nachdem wir uns die Funktion angesehen haben, ist der Geltungsbereich des Namens nur innerhalb der Funktion und er kann immer noch nicht von der aufgerufen werden draußen; erinnern Sie sich an die ersten beiden Wissenspunkte und beginnen Sie dann mit der Erweiterung des Tricks
3. Bereichskette
Passen Sie die Funktion an und sehen Sie, was das Ausführungsergebnis des folgenden Codes ist?
Traceback (most recent call last): File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module> print(name) NameError: name 'name' is not defined
Okay, genug der Vorahnung, die endgültige Version ist da~~
#作用域链 name = "lzl" def f1(): name = "Eric" def f2(): name = "Snor" print(name) f2() f1()
, oder „eric“ drucken? Merken Sie sich Ihre Antwort, anstatt die Antwort jetzt zu posten, werfen Sie einen Blick auf den folgenden Code:
Das Ausführungsergebnis ist „lzl“, Analysieren des Im obigen Code ist das Ausführungsergebnis von f2() die Speicheradresse der Funktion f1, d. h. die Ausführung von ret() entspricht der Ausführung von f1() und hat nichts mit f2 zu tun (), name="lzl" und f1() befinden sich in einer Bereichskette. Wenn sich keine Variable innerhalb der Funktion befindet, wird nach ihr gesucht, sodass der Variablennamenwert zu diesem Zeitpunkt „lzl“ ist Dann kennen Sie auch den ultimativen Code, auf den die Antwort gerade nicht gegeben wurde. Die Antwort lautet
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2()
5. Sina-Interviewfragen
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" return f1 ret = f2() ret() #输出:lzl
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() # 输出:lzl
Sie können sehen, dass li ein Listentyp ist und die Elemente in der Liste Funktionen sind. Geben Sie dann den Rückgabewert des ersten Elements in aus Die Liste. Was ist zu diesem Zeitpunkt der Rückgabewert?
liDer Rückgabewert der ersten Funktion ist 9, nicht 0. Denken Sie daran: Der interne Code wird nicht ausgeführt, bevor die Funktion ausgeführt wird. Sie können den Code im Blog üben, um Ihren Eindruck zu vertiefen
li = [lambda :x for x in range(10)]