Python 会infer并在看到作用域内声明的变量时使用内部作用域中的变量,即使该变量是在使用后声明的.
为了演示这一点,我创建了两个场景。
内部作用域内声明的变量
变量按以下顺序推断:局部变量、非局部变量和全局变量。自从x
在内部作用域内声明,Python 将推断并使用x
在此范围内,即使它是在使用后声明的。
注意Python无法区分修改 from 宣言;本来想修改什么x
来自全局范围的被解释为声明另一个变量x
那个范围之内。
内部作用域内没有声明变量
如果内部作用域内没有声明变量,Python 会将推断作用域切换为非局部作用域,然后切换为全局作用域。
显式切换范围
如果您明确声明了范围x
事先,Python 不必进行推断。
下面的代码不会抛出错误,因为它使用的作用域明确是全局作用域而不是内部作用域。
x = 5
def scope():
global x
print(x)
x = 7
print(x)
Scopes
通过选择要使用的范围,您不仅可以using该特定范围内的变量,而且修改变量。因此,在处理范围时需要格外小心。
因为Python无法区分变量声明 from 变量修改,我的建议是,如果你想使用全局变量,你应该事先明确声明它。
这也适用于嵌套范围。
x = 5
def outer():
x = 7
def inner():
nonlocal x
print(x)
x = 3
print(x)
inner()
运行外部函数会得到以下结果。
>>> outer()
7
3
尝试改变nonlocal
关键字到global
并看到不同的结果;或者完全删除该行会出现错误。