Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有except块的变量作用域:Python 2和3之间的区别_Python_Python 3.x_Python 2.7 - Fatal编程技术网

带有except块的变量作用域:Python 2和3之间的区别

带有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

我在Python2.7和Python3.7之间的局部变量作用域上遇到了一个奇怪的差异

考虑这个人工脚本
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