变量的作用域(scope)是指它的可访问上下文。在Python中,有4个主要的作用域,可以通过LEGB原则记住:
关键字global允许在函数内部修改在全局范围内声明的变量。
def foo(): global my_var my_var = 10 # 修改全局变量
如果没有global,函数内部的变量被视为局部的,即使在外部作用域中存在同名变量。
"下面的代码会输出什么?"
x = 10 def func(): x = 20 func() print(x)
答案:
输出10,因为在函数内部创建了一个新的局部变量x,全局变量未被修改。
故事
在机器人的命令处理程序中,想要存储一个全局计数器,但忘记了使用global:
counter = 0 def increment(): counter += 1 # UnboundLocalError: 局部变量'counter'在赋值前引用
错误是因为解释器认为counter是一个局部变量(因为在函数中进行了赋值),而不是全局变量。
故事
在嵌套函数中忘记了,如果没有关键字nonlocal,隐含变量会创建局部作用域:
def outer(): x = 0 def inner(): x += 1 # UnboundLocalError,x在inner中被视为局部的
正确做法:
def outer(): x = 0 def inner(): nonlocal x x += 1
故事
写了一行代码:
x = 5 y = (lambda: (x := x + 1))() # 在Python < 3.8中为SyntaxError,或者在之后为UnboundLocalError
忘记了表达式和lambda的作用域的区别。并非所有结构都支持在lambda内部的赋值,具体取决于Python的版本。