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