Python のスコープを修正するための 5 つのポイント

高洛峰
リリース: 2016-10-17 11:33:46
オリジナル
1203 人が閲覧しました

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 &#39;name&#39; is not defined
ログイン後にコピー

変数名を出力する前に、この関数を実行すると出力が変わりますか?

#局部作用域
  
def  func():
    name = "lzl"
  
func()          #执行函数
print(name)
ログイン後にコピー

実行してもエラーが報告されます。先ほどの文に戻りましょう。関数が実行されたとしても、name のスコープは関数内にのみあり、まだ呼び出すことはできません。外側から; 最初の 2 つを入力します。知識ポイントを覚えておいてください。次にスキルを拡張していきます


3. 関数を調整して、次のコードの実行結果を確認してください。

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
ログイン後にコピー

関数を学習したら、f1() が実行された後に Snor が出力されることを知っておく必要があります。まず概念を覚えておいてください。Python にはスコープ チェーンがあり、変数は内部から外部に検索されます。 、まず自分のスコープに行きます 見つからずエラーを報告するまで上司に探しに行きませんでした

4. 究極版のスコープ

さて、伏線はこれくらいにして、究極版です。はこちらです~~

 
#作用域链
  
name = "lzl"
def f1():
    name = "Eric"
    def f2():
        name = "Snor"
        print(name)
    f2()
f1()
ログイン後にコピー

考えてみてください 結局、f2()の実行結果は「lzl」と「eric」を出力するのでしょうか?答えを今は投稿しないでください。次のコードを見てください。


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)]
ログイン後にコピー
li最初の関数の戻り値は 0 ではなく 9 です。覚えておいてください: 関数が実行される前に内部コードは実行されません。ブログ内のコードを自分で練習して、印象を深めてください。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!