Heim  >  Artikel  >  Backend-Entwicklung  >  Die fünf Punkte von Python zur Korrektur des Umfangs

Die fünf Punkte von Python zur Korrektur des Umfangs

高洛峰
高洛峰Original
2016-10-17 11:33:461210Durchsuche

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 &#39;name&#39; is not defined
Beim Ausführen wird ein Fehler gemeldet. Ich glaube, das kann jeder verstehen. Die Namensvariable wird nur innerhalb der Funktion func() wirksam existiert nicht global. Nehmen Sie eine einfache Anpassung am obigen Code vor und sehen Sie, was das Ergebnis ist.

Fügen Sie eine Codezeile hinzu Vorheriger Code: Bevor der Name gedruckt wird, wird eine Funktion ausgeführt. Wird sich der Druck zu diesem Zeitpunkt ändern?

#局部作用域
  
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 &#39;name&#39; is not defined

Wenn Sie Funktionen gelernt haben, müssen Sie wissen, dass Snor nach der Ausführung von f1() ausgegeben wird. Erinnern wir uns zunächst an ein Konzept Bei einer Bereichskette in Python wird die Variable von innen nach außen durchsucht. Gehen Sie zuerst zu Ihrem eigenen Bereich, um sie zu finden, und gehen Sie dann zur übergeordneten Ebene, um sie zu finden, bis Sie sie nicht mehr finden und einen Fehler melden

4. Endgültiger Umfang

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()
Ja, die Ausgabe lautet „lzl“. Denken Sie daran, dass vor der Ausführung der Funktion der Bereich bereits gebildet wurde und die Bereichskette ebenfalls generiert wurde

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
Bestimmen Sie die Art von Li? Welcher Art sind die Elemente in li?

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)]
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn