【问题标题】:Python: Variables are still accessible if defined in try or if?Python:如果在 try 或 if 中定义,变量仍然可以访问?
【发布时间】:2015-07-19 19:37:25
【问题描述】:

我是 Python 初学者,具有 C/C++ 背景。我正在使用 Python 2.7。

看了这篇文章:A Beginner’s Guide to Python’s Namespaces, Scope Resolution, and the LEGB Rule,我想我对 Python 的这些技术有了一些了解。

今天我意识到我可以这样写 Python 代码:

if condition_1:
    var_x = some_value
else:
    var_x = another_value
print var_x

也就是说,var_x 仍然是可访问的,即使它定义 before if。因为我来自 C/C++ 背景,所以这对我来说是新事物,就像在 C/C++ 中一样,var_x 定义在 if 和 else 所包围的范围内,因此您无法再访问它,除非您之前定义了 var_x if.

我尝试在 Google 上搜索答案,但由于我还是 Python 新手,我什至不知道从哪里开始以及应该使用哪些关键字。

我的猜测是,在 Python 中,if 不会创建新范围。在if 中新定义的所有变量都只是在if 所在的范围内,这就是为什么在if 之后仍然可以访问该变量的原因。但是,如果在上面的示例中,var_x 仅在 if 中定义,但在 else 中没有定义,则会发出警告,指出 print var_x 可能引用可能未定义的变量。

我对自己的理解有些信心。但是,如果我在某处有错误,有人可以帮助纠正我,或者给我一个讨论此问题的文档链接吗?

谢谢。

【问题讨论】:

  • 你是对的。在 if/elif/else 块中定义的变量在包含该块的范围内可见。
  • 这也适用于forwhile 循环,以及with 语句。基本上除了函数和类之外的所有东西(您仍然可以通过类的名称访问变量:Cls.var)。
  • 您可以使用locals()globals() 查看范围内的内容和范围之外的内容
  • @MarkusMeskanen 你是对的。但是,还有其他封闭范围,例如推导式,其中创建的变量对周围的代码不可见。
  • @MattDMo:仅适用于 Python 3.x。在 2.x 中,理解变量是在周围范围内定义的。

标签: python scope


【解决方案1】:

我的猜测是,在 Python 中,if 不会创建新范围。 if 中新定义的所有变量都只是在 if 所在的范围内,这就是为什么在 if 之后仍然可以访问该变量的原因。

没错。在 Python 中,基本上决定变量范围的 namespaces 只为模块和函数(包括方法;基本上任何 def)创建。所以在一个函数中(而不是在子函数中)发生的所有事情都放在同一个命名空间中。

重要的是要知道,函数中仅存在赋值就会在本地命名空间中保留一个名称。这导致了一些有趣的情况:

def outer ():
    x = 5
    def inner ():
        print(x)
        # x = 10
    inner()
outer()

在上面的代码中,注释掉该行后,代码将打印5,如您所料。这是因为inner 将在外部范围内查找名称x。但是,如果您添加行 x = 10,则名称 xlocalinner,因此 earlier 查找 x 将在inner 的本地命名空间。但是由于它还没有被赋值,你会收到一个UnboundLocalError“赋值前引用的局部变量'x'”)。在 Python 3 中添加了 nonlocal 语句来解决一个问题:您想要在内部函数中实际修改外部范围的 x 的情况。

有关名称查找的更多信息,请参阅this related question

【讨论】:

  • 谢谢,知道你在这里提到的情况很有趣。我从来不知道这个!
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2013-06-11
  • 1970-01-01
相关资源
最近更新 更多