1. ブロックレベルのスコープ
考えてみて、この時点で次のプログラムを実行すると何か出力があるでしょうか?処刑は成功するでしょうか?
#块级作用域 if 1 == 1: name = "lzl" print(name) for i in range(10): age = i print(age)
まず実行結果を見てみましょう
C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py lzl 9 Process finished with exit code 0
コードは正常に実行され、問題はありません。Java/C# では、上記のコードを実行すると、名前と年齢が定義されていないことが示されますが、これは、Python にはブロックレベルのスコープがないため、コード ブロック内の変数は正常に実行できます。
前に学習した知識を復習してください。関数を学習するとき、関数は個別のスコープです。Python にはブロックレベルのスコープはありませんが、次のコードを見てください
#localscope
。このコードを実行して考えてください。何か出力があるでしょうか?
def func(): name = "lzl" print(name)
実行エラーです。これは誰でも理解できると思います。name 変数は func() 関数内でのみ有効であるため、グローバルに呼び出すことはできません。上記のコードを簡単に調整してから、内容を確認してください。結果は?
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)
3. 関数を調整して、次のコードの実行結果を確認してください。
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
関数を学習したら、f1() が実行された後に Snor が出力されることを知っておく必要があります。まず概念を覚えておいてください。Python にはスコープ チェーンがあり、変数は内部から外部に検索されます。 、まず自分のスコープに行きます 見つからずエラーを報告するまで上司に探しに行きませんでした
4. 究極版のスコープ
さて、伏線はこれくらいにして、究極版です。はこちらです~~#作用域链 name = "lzl" def f1(): name = "Eric" def f2(): name = "Snor" print(name) f2() f1()
f2() の実行結果は関数 f1 です。 ret=f1; ret() を実行するときのメモリアドレスは、f1() を実行するときと同じです。スコープチェーン、関数内 変数がなければ外側を見ることになるので、このときの変数名の値は「lzl」です これが理解できれば、最終的にやったコードの答えもわかります。今は答えません
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2()
はい、関数が実行される前に、スコープが形成され、スコープチェーンも生成されていることを思い出してください。 5. Sina のインタビューの質問
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" return f1 ret = f2() ret() #输出:lzl
李のタイプを判断しますか? li の要素はどのような型ですか?
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() # 输出:lzl
li がリスト型で、リスト内の要素が関数であることがわかります。 次に、リストの最初の要素の戻り値を出力します。
li = [lambda :x for x in range(10)]