我知道python通常只为类、函数等创建新的作用域,但我对try/except块或上下文管理器中的as语句感到困惑.在块内部分配的变量可以在块外部访问,这是有意义的,但与as绑定的变量本身就没有意义.

所以这失败了:

try:
    raise RuntimeError()
except RuntimeError as error:
    pass

print(repr(error))

但这成功了:

try:
    raise RuntimeError()
except RuntimeError as e:
    error = e

print(repr(error))

as绑定的变量发生了什么,为什么不应用常规的python范围规则?PEP表示它只是一个正常绑定的python变量,但事实似乎并非如此.

推荐答案

正如在PEP 3110current documentation中所解释的,在except块中与as绑定的变量在块的末尾被显式地特别清除,即使它们共享相同的局部范围.这提高了垃圾收集的即时性.as语法最初不适用于2中的异常.十、它的后端口是for 2.6,但旧的是were preserved.

同样的does not applywith个街区:

>>> from contextlib import contextmanager
>>> @contextmanager
... def test():
...     yield
... 
>>> with test() as a:
...     pass
... 
>>> a # contains None; does not raise NameError
>>> 
>>> def func(): # similarly within a function
...     with test() as a:
...         pass
...     return a
... 
>>> func()
>>> 

该行为特定于except块,not特定于as关键字.

Python相关问答推荐

如何确保Flask应用程序管理面板中的项目具有单击删除功能?

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

Flask:如何在完整路由代码执行之前返回验证

CustomTKinter-向表单添加额外的输入字段

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

Python -根据另一个数据框中的列编辑和替换数据框中的列值

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

即使在可见的情况下也不相互作用

'discord.ext. commanders.cog没有属性监听器'

需要计算60,000个坐标之间的距离

运行终端命令时出现问题:pip start anonymous"

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

基于字符串匹配条件合并两个帧

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

Pre—Commit MyPy无法禁用非错误消息

为什么抓取的HTML与浏览器判断的元素不同?

driver. find_element无法通过class_name找到元素'""

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

Pandas Loc Select 到NaN和值列表