编程后端开发人员

在Python中,变量的作用域是什么,关键字`global`是如何工作的?请给出一个示例,说明对作用域的错误理解如何导致错误。

用 Hintsage AI 助手通过面试

答案。

变量的作用域(scope)是指它的可访问上下文。在Python中,有4个主要的作用域,可以通过LEGB原则记住:

  • Local(局部)— 在函数内部。
  • Enclosing(包围)— 在外部函数内部,用于嵌套函数。
  • Global(全局)— 在模块级别。
  • Built-in(内置名称)。

关键字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的版本。