“with”语句中变量的范围?

问题描述 投票:0回答:2

我只使用Python读取第一行:

with open(file_path, 'r') as f:
    my_count = f.readline()
print(my_count)

我对

my_count
变量的范围有点困惑。虽然 print 语句工作得很好,但是首先在
my_count = 0
语句之外做类似
with
的事情不是更好吗(例如,在 C 中我会做
int my_count = 0
)?

python scope with-statement
2个回答
144
投票

with
语句不会创建作用域(如
if
for
while
也不创建作用域)。

因此,Python 将分析代码并发现您在

with
语句中进行了赋值,从而使变量成为本地变量(到真实作用域)。

在Python中,变量不需要在所有代码路径中进行初始化:作为程序员,您有责任确保在使用变量之前对其进行赋值。这可能会导致代码更短:假设您确定列表至少包含一个元素,那么您可以在

for
循环中进行分配。在 Java 中,
for
循环中的赋值不被认为是安全的(因为循环体可能永远不会被执行)。

with 范围之前初始化可以更安全,因为在

with
语句之后我们可以安全地假设变量存在。另一方面,如果变量
should
with 语句中赋值,则在
with
语句之前不初始化它实际上会导致额外的检查:如果不知何故在
with
语句中跳过了赋值,Python 将出错.

with 语句仅用于上下文管理目的。它强制(通过语法)您在

with

中打开的上下文在缩进末尾关闭。

    


8
投票
Python 文档

。很明显,这不是关于创建范围,而是关于使用Context Manager。我引用了有关上下文管理器的 python 文档

上下文管理器是一个定义执行 with 语句时要建立的运行时上下文的对象。上下文管理器处理执行代码块所需的运行时上下文的进入和退出。上下文管理器通常使用 with 语句调用(在 with 语句部分中描述),但也可以通过直接调用其方法来使用。

上下文管理器的典型用途包括保存和恢复各种全局状态、锁定和解锁资源、关闭打开的文件等。

© www.soinside.com 2019 - 2024. All rights reserved.