【问题标题】:Variable scope in case of an exception in pythonpython中出现异常时的变量范围
【发布时间】:2016-10-07 17:59:46
【问题描述】:
while True:
  try:
    2/0
  except Exception as e:
    break

print e      

给出:整数除法或除以零

我认为e 的范围在while 块内,并且在外部print 语句中无法访问。我错过了什么?

【问题讨论】:

  • 当然,你应该只在except中使用e,因为如果你没有遇到异常,它就不存在(或者是不同的东西)。
  • @KennyOstrom 好点。

标签: python python-2.7 exception


【解决方案1】:

简单:while 不会在 Python 中创建作用域。 Python 只有以下作用域:

  • 函数范围(可能包括闭包变量)
  • 类范围(仅在定义类时)
  • 全局(模块)范围
  • 理解/生成器表达式范围

因此,当您离开 while 循环时,e 作为局部变量(如果循环在函数中)或全局变量(如果不是)仍然可用。

tl;dr:Python 不是 C。

【讨论】:

【解决方案2】:

except ... as e中,e在跳出try except时会被丢弃,无论之前是否定义过。

当使用 as target 分配异常时,它会在 except 子句的末尾被清除。

参考官网链接: https://docs.python.org/3/reference/compound_stmts.html#the-try-statement

【讨论】:

  • 问题最初被标记为python-2.x,你描述的行为是3.x特有的。
  • 哦,我忽略了python-2.x这个标签,我粗心了。
【解决方案3】:

我刚刚遇到了类似的事情。 except 中的as 的行为与预期不符:

#!/usr/bin/python3.6

exc = 'foofoo'
print('exc in locals?', 'exc' in locals())
try:
  x = 1 / 0
except Exception as exc:
  print('exc in locals?', 'exc' in locals())
  print('Error', exc)
print('exc in locals?', 'exc' in locals())
print('Sorry, got an exception', exc)

这会产生以下输出。 NameError 表示exc 不再在locals() 中。

% ./g.py 
exc in locals? True
exc in locals? True
Error division by zero
exc in locals? False
Traceback (most recent call last):
  File "./g.py", line 11, in <module>
    print('Sorry, got an exception', exc)
NameError: name 'exc' is not defined
% 

as ex 将变量从作用域中移除。我还没有找到对此的解释。此代码产生预期的输出:

#!/usr/bin/python3.6

exc = 'foofoo'
print('exc in locals?', 'exc' in locals())
try:
  x = 1 / 0
except Exception as exc_:
  exc = str(exc_)
  print('exc in locals?', 'exc' in locals())
  print('Error, exc)
print('exc in locals?', 'exc' in locals())
print('Sorry, got an exception', exc)

这解释了观察到的行为:Python 3 try statement

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多