Python 2と3の役割ドメインの違い

1765 ワード

最近暇な时に《Python核心プログラミング》の第2版を见て、この本はとても年を取ってしかし基础知识はとてもそろって、自分でずっとPython 3で実践して、1つの面白い现象を発见します.
Pythonの役割ドメインとC/C++の違い
まずC++erとしてPythonに触れたばかりのときに疑問に思ったのは、次のようなコードです.
if 1 < 2:
    x = 1
else:
    x = -1

print(x)

現代のC++erの基本的な素質は常にある変数のライフサイクルを銘記するので、C++の変数が作用域を離れて廃棄する考え方に従って、私はここの変数xがすでに回収されたと感じます.if-elseブロックの外にxを印刷することは、未定義のオブジェクトを参照することに相当します.しかし、pythonの役割ドメイン概念はC++とは異なり、def/class/lambdaのみがpython変数の役割ドメインに影響し、if-elseブロック/try-except-finallyブロック/forブロック/whileブロックは変数の役割ドメインを変更しないため、このコードは正しい.
Python異常パラメータの2と3の役割ドメインの違い
そして実践10.3.6節のコードでpython 2と3が異常パラメータのライフサイクルで異なることがわかりました
Python 2.7.12 (default, Nov 20 2017, 18:23:56) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> try:
...     1 / 0
... except Exception, e:
...     pass
... 
>>> type(e)

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> try:
...     1 / 0
... except Exception as e:
...     pass
... 
>>> type(e)
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'e' is not defined

python 2では、exceptに続く異常パラメータeはtry-exceptブロックの外でアクセス可能であるが、python 3では不可能であり、eが定義されていないことを示す.ただしexceptブロックで定義された変数が外部アクセス可能である場合
>>> try:
...     1 / 0
... except Exception as e:
...     e0 = e
...     pass
... 
>>> type(e0)


すなわちpython 3のtry-exceptブロックは変数の役割ドメインを変更しないが、exceptの後続の異常パラメータはデフォルトで外部には表示されない.