变量范围"与"声明?

时间:2017-07-14 10:07:12

标签: python scope with-statement

我正在使用以下方式从python中读取firstline

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

我对变量my_count的范围感到困惑。虽然打印效果很好,但最好先用语句my_count = 0做一些事情(比如在C中用来做int my_count = 0

2 个答案:

答案 0 :(得分:16)

with语句未创建范围(例如ifforwhile也不会创建范围。< / p>

因此,Python将分析代码并看到您在with语句中进行了赋值,因此这将使变量成为本地变量(到实际范围)。

在Python变量中,所有代码路径中不需要初始化:作为程序员,您有责任确保在使用变量之前分配变量。这可以导致更短的代码:例如,您确定列表包含至少一个元素,然后您可以在for循环中进行分配。在Java中,for循环中的赋值不被认为是安全的(因为循环体可能永远不会被执行)。

with范围之前的初始化with语句之后我们可以安全地假设变量存在的意义上可以更安全。另一方面,如果 应该在with语句中分配变量,则在with语句实际导致额外检查之前不对其进行初始化:如果不知何故,Python将会出错在with声明中跳过了作业。

with语句仅用于上下文管理目的。它强制(通过语法)在缩进结束时关闭with中打开的上下文。

答案 1 :(得分:2)

您还应该通过PEP-343和Python Documentation。它将清楚地表明它不是关于使用Context Manager创建范围。我在上下文管理器上引用了python文档

  

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

     

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