Python中出现意外的名称错误 >e='e' >>>e “e” >>>try:引发异常 例外情况除外,如e: e='e' a='a' >>>e 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 E NameError:未定义名称“e” >>>a “a”

Python中出现意外的名称错误 >e='e' >>>e “e” >>>try:引发异常 例外情况除外,如e: e='e' a='a' >>>e 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 E NameError:未定义名称“e” >>>a “a”,python,variables,exception,nameerror,try-except,Python,Variables,Exception,Nameerror,Try Except,我以前没有注意到这种行为。为什么将变量用作try-except别名会使其丢失以前的定义?当使用as-target分配了异常时,它会在except子句的末尾被清除。在这种情况下: >>> e = 'e' >>> e 'e' >>> try: raise Exception except Exception as e: e = 'e' a = 'a' >>> e Traceback (most recent c

我以前没有注意到这种行为。为什么将变量用作try-except别名会使其丢失以前的定义?

当使用as-target分配了异常时,它会在except子句的末尾被清除。在这种情况下:

>>> e = 'e'
>>> e
'e'
>>> try: raise Exception
except Exception as e:
    e = 'e'
    a = 'a'

>>> e
Traceback (most recent call last):
  File "<pyshell#333>", line 1, in <module>
    e
NameError: name 'e' is not defined
>>> a
'a'
翻译成

except Exception as e:
    e = 'e'
    a = 'a'

因此,如果我们试图访问
e
,它将给出一个错误。

这是一个奇怪的副作用
尝试
/
除了
(如
如果
/
否则
)不创建新名称空间,因此那里的
e
肯定会消灭你的全局
e
。除了之外,它在
之后蒸发的事实只是稍微令人惊讶,@SuperStormer我认为它确实如此
except Exception as e:
    try:
        e = 'e'
        a = 'a'
    finally:
        del e