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 ではコード ブロックにブロック レベルのスコープがないため、コード ブロック内の変数は正常に実行できます。以前に学習した知識で、関数を学習するとき、関数は個別のスコープであり、Python にはブロックレベルのスコープはありませんが、ローカルスコープがあります。次のコードを見てください
#局部作用域 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)
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
見つからずにエラーを報告するまで、上司に探しに行きませんでした
さて、伏線はこれで十分です。究極バージョンはここにあります~~#作用域链 name = "lzl" def f1(): name = "Eric" def f2(): name = "Snor" print(name) f2() f1()
最後のf2を考えてください() 実行結果は「lzl」または「eric」と表示されますか?答えを今すぐ投稿する代わりに、次のコードを見てください:
#终极版作用域 name = "lzl" def f1(): print(name) def f2(): name = "eric" f1()
#终极版作用域 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()
li = [lambda :x for x in range(10)]
print(type(li)) print(type(li[0])) # <class 'list'> # <class 'function'>