我是Python初学者,我来自C/C++背景.我正在使用Python 2.7.
我读了这篇文章:Python的命名空间,范围解析和LEGB规则的初学者指南,我想我对Python的这些技术有一些了解.
今天我意识到我可以像这样编写Python代码:
if condition_1:
var_x = some_value
else:
var_x = another_value
print var_x
Run Code Online (Sandbox Code Playgroud)
也就是说,var_x仍然可以访问,即使它没有在 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可能引用可能未定义的变量.
我对自己的理解有信心.但是,如果我在某个地方出错了,有人可以帮我纠正,或者给我一个关于这个问题的文件链接吗?
谢谢.
pok*_*oke 10
我的猜测是,在Python中,
if不会创建新范围.所有新定义的变量if都只是在if的范围内,这就是为什么变量在之后仍然可以访问的原因if.
那是正确的.在Python中,基本上决定变量作用域的名称空间仅为模块和函数(包括方法;基本上是任何def)创建.因此,在函数内(而不是在子函数中)发生的所有事情都放在同一个命名空间中.
然而,重要的是要知道在函数中仅仅存在赋值将在本地命名空间中保留一个名称.这使得一些有趣的情况:
def outer ():
x = 5
def inner ():
print(x)
# x = 10
inner()
outer()
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,注释掉该行,代码将按5您的预期打印.那是因为inner将在外部范围内查找名称x.如果添加行x = 10,虽然,这个名字x将是当地的到inner,所以早期仰望x将查找的本地命名空间inner.但由于尚未分配,您将收到一个UnboundLocalError("赋值前引用的局部变量'x').nonlocal在Python 3中添加了该语句以克服以下问题:您希望x在内部函数中实际修改外部作用域的情况.
有关名称查找的详细信息,请参阅此相关问题.
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |