ホームページ  >  記事  >  バックエンド開発  >  PYTHONでGLOBALを使用することで発生する一連の問題

PYTHONでGLOBALを使用することで発生する一連の問題

WBOY
WBOYオリジナル
2016-12-05 13:27:141393ブラウズ

何が問題だったのでしょうか

Python では、global を使用すると、この関数でグローバル変数を使用できるようになります。同時に、関数内の変数へのアクセスは、最初はローカルで、次にグローバルになります。

入れ子関数でglobalを使うと不合理な動作が発生します。

アップコード:

リーリー

関数x()ではglobalは使わず、この時のbはlocalを使います。したがって、print はローカル b を印刷します

なぜ12と印刷されているのでしょうか?そして、In[101] の b が 2 であることをどう説明しますか?

Y()、使用したグローバルは x() の b = 12 をインポートしませんでした。

関数y()では、global a,bという文でaとbをglobalに展開しているので、最上位レベルではb(In[98])がなくてもb(In[101])が生成されます。

つまり、グローバルa,bは、aとbを最も外側の変数とみなします。

もう一度試してください:

リーリー

エラーが報告されました! y() global b の後に代入がない場合、最上位には b は存在しません。これは、global が名前を導入するだけで、代入などの操作を実行しないことを示しています。

Global は変数が存在するかどうかを気にせず、名前のみをインポートし、名前に対する操作は「トップレベルの名前空間」に反映されます。

また来てください:

リーリー

これは、内層 y() のグローバルが x() のものをインポートしないことを確認します。

それでは、内部関数は外部関数の正しい変数をどのように使用するのでしょうか?

内部関数パラメータの受け渡しの問題を解決する

1.

まず、値を取得するだけなら何も加工する必要はありません。

リーリー

y()では、aに値を代入すると、aはすぐに内部変数になります。

リーリー

関数 y() のどこかで a に値が代入されると、Python は代入前に a が存在しないものとみなします。

同時に、python2のprintでは1つずつ出力することが分かりました。これを踏まえてpython3で再度試してみたところ、一緒に出力されることが分かりました。しかし、これはこの記事の焦点では​​ないので、折りたたむことにします。

リーリー

同時に、Python コードは単に行ごとに実行されるのではなく、実行前にスキャンされることがわかりました。

同時に、NameErrorではなくUnboundLocalErrorが返されることも判明しました。公式の概念である「unbound」に注意してください。 「unbound」を使用して説明すると、次のようになります。グローバルは、トップレベルの変数名をローカル変数名にバインドし、同時に変更します。これは「参照」です。Python は a = 1 を検出すると、a が であることを認識します。ローカルであるため、a が「オブジェクトを指す」場合 (Python 変数はすべて参照であるため)、以前は a を呼び出すことは不正な動作でしたが、この動作は NameError とは異なり、アンバインド ローカルとして定義されています。

二、

list、dictなどの変数を使う

リーリー

エラーは報告されておらず、完璧です!

ステートメント l[:] = ["out msg"] に注意し、スライス割り当てを使用します。それ以外の場合は、

リーリー

コードの 6 行目で l に新しいリストが割り当てられるため、UnboundLocalError が再び発生します。

三、

パラメータの受け渡しを使用します。

リーリー

デフォルトパラメータにリストなどの変数オブジェクトを置かないように注意してください。

上記は、編集者が紹介した PYTHON での GLOBAL の使用によって引き起こされる一連の問題です。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。 。また、スクリプト ハウスの Web サイトをサポートしていただきありがとうございます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。