2017-09-21 9 views
2

この例ではエラーを理解できません。 print(b)6をPython LEGBルールで表示しないでください。インタプリタが行2のの機能をスキャンすると、それはb = 33を記憶してメモリヒープに置くか、bがローカル変数であるという情報を覚えていますか?Python変数のスコープとUnboundLocalError

b = 6 
def f(a): 
    print(a) 
    print(b) 
    b = 33 
f(20) 
# UnboundLocalError: local variable 'b' referenced before assignment 

答えて

1

Pythonが関数をスキャンすると、bという割り当てが表示されます。この割り当てでは、特定のバイトコード(LOAD FAST)が作成され、ローカル変数として名前bを読み込むようにPythonに指示します。機能f用に作成

あなたは(disモジュールを使用して)バイトコードを逆アセンブル場合は、これを見ることができます:ここ

from dis import dis 
dis(f) 
    2   0 LOAD_GLOBAL    0 (print) 
       2 LOAD_FAST    0 (a) 
       4 CALL_FUNCTION   1 
       6 POP_TOP 

    3   8 LOAD_GLOBAL    0 (print) 
      10 LOAD_FAST    1 (b) 
      12 CALL_FUNCTION   1 
      14 POP_TOP 

関連命令は次のとおりです。名前をロード

LOAD_FAST    1 (b) 

bローカル変数として。

print(b)が検出されると、それは名前bをロードしようとしますが、(割り当てが行われていない)、まだb定義されていない:あなたはそれを参照(print(b))それへの割り当てが行われている前に。

+0

disモジュールは何が起こっているかを示します。それは機能の全身を読み込んで動作しますか?その後、画面上でバイトコードを印刷するか、各行スキャンの後に印刷しますか? –

+0

'dis'の全ては、' f .__ code__'にあるものを作成する必要があります。何も読み込まない、既に存在するものを使用します@MarkoSavic –

関連する問題