疯狂的Python-20(消失的变量e)

疯狂的Python-20(消失的变量e)_第1张图片

一些有趣的鲜为人知的Python特性集合

无论你是Python新手还是Python老手,我相信,这个系列的文章都会让你获益良多!

阅读此系列任何文章前请务必观看:疯狂的Python-目录大纲


▶ 消失的变量e

e = 7
try:
    raise Exception()
except Exception as e:
    pass

Output (Python 2.x):

>>> print(e)
# 什么都没有打印

Output (Python 3.x):

>>> print(e)
NameError: name 'e' is not defined

:bulb: 解释:

  • 参考自: https://docs.python.org/3/reference/compound_stmts.html#except

    当一个异常(exception)被用as赋值给一个变量后,这个变量将会在except语句块结束后清除。看下面这段

    except E as N:
        foo
    

    相当于这样

    except E as N:
        try:
            foo
        finally:
            del N
    

    这意味着你最好不要在外面定义一个和"N"重名的变量。这些被赋值的异常变量被清除是因为,Python会将这些变量加入一个异常回溯栈中(traceback,仔细观察每次程序出错控制台输出的错误信息就是从tranceback这个堆栈里面以此取出来的),记录这些异常的具体位置信息并且一直保持这个堆栈的信息直到下一次垃圾回收开始。

  • 这些Python的子句并没有独立的作用域,上面所有的例子都在一个作用域里,所以当变量eexcept子句里面被移除后,就相当于在整个作用域都消失了。但是在函数中情况就和上面不一样了,因为Python函数有自己的“内部”作用域。下面这个例子将说明这种情况:

    def f(x):
        del(x)
        print(x)
    
    x = 5
    y = [5, 4, 3]
    

    Output:

    >>>f(x)
    UnboundLocalError: local variable 'x' referenced before assignment
    >>>f(y)
    UnboundLocalError: local variable 'x' referenced before assignment
    >>> x
    5
    >>> y
    [5, 4, 3]
    
  • 在 Python 2.x 版本里面, 变量e会被赋值Exception()实例,所以当打印的时候什么都不会打印出来。

    Output (Python 2.x):

    >>> e
    Exception()
    >>> print e
    # 什么都没有打印出来
    

你可能感兴趣的:(疯狂的Python-20(消失的变量e))