MST

星途 面试题库

面试题:Python模块命名空间与作用域之全局与局部变量修改

给定以下Python代码: ```python a = 5 def func(): global a a = a + 10 b = a def inner(): nonlocal b b = b * 2 return b return inner() ``` 请说明 `func()` 函数的返回值,并详细阐述 `global` 和 `nonlocal` 关键字在这个代码片段中的作用,以及命名空间和作用域是如何相互影响的。
25.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. func() 函数的返回值
    • 首先,全局变量 a 初始值为 5
    • func 函数中,使用 global 关键字声明 a 为全局变量,然后执行 a = a + 10,此时 a 的值变为 5 + 10 = 15
    • 接着,将 a 的值赋给 b,即 b = 15
    • inner 函数中,使用 nonlocal 关键字声明 b 为外部函数(func 函数)的局部变量,然后执行 b = b * 2,此时 b 的值变为 15 * 2 = 30,并返回 b 的值。
    • 所以,func() 函数的返回值是 30
  2. global 关键字的作用
    • func 函数中,global a 声明了 a 是全局变量。这意味着在 func 函数内对 a 的赋值操作不是创建一个新的局部变量 a,而是直接修改全局作用域中的 a。如果没有 global a 这一行,当执行 a = a + 10 时,Python 会认为要创建一个新的局部变量 a,但由于在赋值前引用了 aa + 10),会导致 UnboundLocalError 错误。
  3. nonlocal 关键字的作用
    • inner 函数中,nonlocal b 声明了 b 是外部函数(func 函数)的局部变量,而不是在 inner 函数中创建一个新的局部变量 b。如果没有 nonlocal b 这一行,当执行 b = b * 2 时,Python 会认为要创建一个新的局部变量 b,但由于在赋值前引用了 bb * 2),会导致 UnboundLocalError 错误。
  4. 命名空间和作用域的相互影响
    • 全局命名空间:包含全局变量 a。在整个程序的生命周期内存在。
    • func 函数的局部命名空间:当 func 函数被调用时创建,包含局部变量 b。当 func 函数执行结束,这个局部命名空间被销毁,除非 b 被返回或有其他方式被外部引用。由于使用了 global afunc 函数可以访问并修改全局命名空间中的 a
    • inner 函数的局部命名空间:当 inner 函数被调用时创建。由于使用了 nonlocal binner 函数可以访问并修改 func 函数局部命名空间中的 binner 函数不能直接访问全局命名空间中的变量,除非使用 global 关键字声明。

综上所述,func() 函数返回 30globalnonlocal 关键字分别用于正确访问和修改全局变量与外部函数的局部变量,同时它们也体现了不同命名空间和作用域之间的关系。