Python:如果在 try 或 if 中定义变量仍然可以访问?

标签 python scope

<分区>

我是 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

也就是说,即使 在 if 之前定义 var_x,它仍然是可访问的。因为我是C/C++出身,所以这对我来说是个新鲜事,因为在C/C++中,var_x定义在if和else所包围的范围内,所以你不能再访问它,除非你在 if 之前定义 var_x

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

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

我对自己的理解有些自信。但是,如果我哪里错了,有人可以帮助纠正我,或者给我一个讨论这个问题的文档的链接吗??

谢谢。

最佳答案

My guess is that, in Python, if does not create new scope. All the variables that are newly defined in if are just in the scope that if resides in and this is why the variable is still accessible after the if.

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

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

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

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

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

关于Python:如果在 try 或 if 中定义变量仍然可以访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31505149/

相关文章:

python - Bleeding Edge/Nightly Build Python 中的依赖管理。策略和最佳实践?

python - PyQt5 关闭事件方法

python - Matplotlib 散点图和直方图

python - Cloud Scheduler 调用的 GCP Cloud Run 应用程序的当前最大超时是多少

ruby - 如何避免类和全局变量

css - 用于在外部范围内计算变量时,将忽略CSS范围内的自定义属性

python - Django Server启动后如何自动启动其他Server

javascript - 范围和评估说明

c++ - 为什么具有相同名称但不同签名的多重继承函数不被视为重载函数?

ruby-on-rails - Ruby on Rails : How to use scope named 'open' ?