【问题标题】:using python variable outside with statement在 with 语句之外使用 python 变量
【发布时间】:2017-06-08 13:54:12
【问题描述】:

在 Python 脚本中,我遇到了一个在 with 语句中定义的变量,但该变量在语句之外使用,例如以下示例中的 file

with open(fname, 'r') as file:
    pass
print(file.mode)

直觉上我会说file 不应该存在于with 语句之外,而且这只是偶然的。我在 Python 文档中找不到关于这是否应该工作的结论性声明。这种类型的语句是否可以安全使用(也适用于未来的 python 版本),还是应该避免?在 Python 文档中指向此信息的指针也会非常有帮助。

【问题讨论】:

  • 您发布的代码不应该工作。离开上下文管理器(with 块)将关闭文件。 我的立场是正确的。请参阅下面的 cmets。
  • @WillDaSilva 你试过了吗?它适用于 Python 2.7
  • 它确实有效,因为file.mode 不访问文件本身,只访问 Python 对象。
  • with 块不会创建新范围。所有引用都在本地范围内创建。循环等也是如此,这就是为什么在for i in range(5): 之后,i 仍然可用。 with 块将 close 文件句柄。
  • 是的,文件将被关闭。但表示已关闭文件的对象仍然可用,因为 print() 调用与 with 语句在同一范围内。

标签: python with-statement


【解决方案1】:

变量范围仅适用于functionmoduleclass 级别。如果您在同一个函数/模块/类中,则定义的所有变量都将在该函数/模块/类中可用,无论它是否在withforif 等块中定义。

例如,这个:

for x in range(1):
    y = 1
print(y)

与您使用 with 语句的示例一样有效(尽管毫无意义)。

但是,您必须小心,因为如果从未输入过代码块,则代码块中定义的变量可能实际上并未被定义,如本例所示:

try:
    with open('filedoesnotexist', 'r') as file:
        pass
except:
    pass # just to emphasize point

print(file.mode)

Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    file.mode
NameError: name 'file' is not defined

Good description of LEGB rule of thumb for variable scope

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 2012-10-31
    • 2020-08-02
    • 2021-04-20
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多