python中的异常情况下的变量范围

时间:2016-10-07 17:59:47

标签: python python-2.7 exception

while True:
  try:
    2/0
  except Exception as e:
    break

print e      

给出:整数除法或以零为模

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

3 个答案:

答案 0 :(得分:5)

简单:while不会在Python中创建范围。 Python只有以下范围:

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

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

tl; dr:Python不是C。

答案 1 :(得分:0)

我刚遇到类似的情况。例外中的MyTable的行为不符合预期:

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

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

答案 2 :(得分:0)

viewpager中,当跳出except ... as e时,e将会被丢弃,无论是否定义过。

  

使用异常作为目标分配了异常后,该异常将在except子句的末尾清除。

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