带有except块的变量作用域:Python 2和3之间的区别
我在Python2.7和Python3.7之间的局部变量作用域上遇到了一个奇怪的差异 考虑这个人工脚本带有except块的变量作用域:Python 2和3之间的区别,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我在Python2.7和Python3.7之间的局部变量作用域上遇到了一个奇怪的差异 考虑这个人工脚本unboundlocalexception.py(我意识到我可以在Exception之后使用else块,但我从一个较长的函数中提取了这个示例): 在Python 2下,它的工作方式与我预期的一样: $ python2 unboundlocalexception.py I tried to divide by zero 但是,令人惊讶的是,在Python3下,出现了一个UnboundLocal
unboundlocalexception.py
(我意识到我可以在Exception之后使用else块,但我从一个较长的函数中提取了这个示例):
在Python 2下,它的工作方式与我预期的一样:
$ python2 unboundlocalexception.py
I tried to divide by zero
但是,令人惊讶的是,在Python3下,出现了一个UnboundLocalError
$ python3 unboundlocalexception.py
I tried to divide by zero
Traceback (most recent call last):
File "unboundlocalexception.py", line 11, in <module>
foo()
File "unboundlocalexception.py", line 8, in foo
if arithmetic_error is None:
UnboundLocalError: local variable 'arithmetic_error' referenced before assignment
$python3 unboundlocalexception.py
我试图除以零
回溯(最近一次呼叫最后一次):
文件“unboundlocalexception.py”,第11行,在
foo()
文件“unboundlocalexception.py”,第8行,在foo中
如果算术错误为无:
UnboundLocalError:赋值前引用的局部变量“算术错误”
这种差异在任何地方都有记录吗?在Python 3中引入这种行为是为了防止引用循环,因为问题中的异常目标--
算术错误--
保留了对回溯的引用
从
使用as target分配异常后,将在
except子句的结尾。这就好像
翻译成
这意味着必须将该异常分配给要处理的其他名称
可以在except子句之后引用它。例外情况已清除
因为有了回溯,它们就形成了一个引用
循环堆栈帧,使该帧中的所有局部变量保持活动状态
直到下一次垃圾回收发生
这一点最初记录在中。对此我太惊讶了。试着弄明白这能回答你的问题吗?就这样,谢谢!看起来你真的复制了这个答案:。您不应复制,而应将问题标记为重复;)我只是简单地看了一下文档,并引用了它——当我回答时,我没有意识到另一个答案。但既然你找到了一个很好的副本,我将结束这个问题。@RiccardoBucco或者至少我会这样做,如果不是用户chepner打败我的话。
$ python3 unboundlocalexception.py
I tried to divide by zero
Traceback (most recent call last):
File "unboundlocalexception.py", line 11, in <module>
foo()
File "unboundlocalexception.py", line 8, in foo
if arithmetic_error is None:
UnboundLocalError: local variable 'arithmetic_error' referenced before assignment
except E as N:
foo
except E as N:
try:
foo
finally:
del N