2017-05-30 4 views
3

Pythonの変数にそのループとtryの外にアクセス可能なので - exceptブロック、私は単純にeがアクセスできるようになるので、以下、このコードスニペットは、正常に動作することを考えた:のPython 2でキャッチした例外インスタンスのスコープと3

try: 
    int('s') 
except ValueError as e: 
    pass 
print(e) 
パイソン2において

(2.7試験)私は期待と出力されるように、それは作業を行います。

invalid literal for int() with base 10: 's' 

しかし、Pythonの3 Iが出力されることに驚いた。

NameError: name 'e' is not defined 

なぜですか?

答えて

5

私は後で答えを見つけたPEP 3110は、Python 3では、より効率的なガベージコレクションを可能にするために、exceptスイートの終わりに捕まえられた名前が削除されることを説明しています。あなたはこの発生を避けたい場合は、構文をも推奨されます:除くスイートは簡単そう

try: 
    ... 
except E as N: 
    ... 
... 
のように翻訳することができるの終わりを越え 周り例外インスタンスを維持することが必要である

状況はNが、ブロックの終了時に削除され、N を保持し、通常通り使用することができる場合

は、

このようになります。