MST

星途 面试题库

面试题:Python函数调用与作用域问题

在Python中,假设有一个嵌套函数,外层函数定义了变量x,内层函数中对x进行了修改,但却没有得到预期结果。请分析可能的原因,并说明函数调用过程中作用域规则是如何影响的,如何修改代码使其达到预期(即内层函数修改外层函数的x变量值)。
39.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

可能原因

  1. 在Python中,默认情况下,内层函数无法直接修改外层函数的变量。如果内层函数中使用一个变量,Python首先会在其本地作用域查找,如果找不到,会依次向上层作用域查找,但如果内层函数试图直接对一个上层作用域的变量赋值,Python会创建一个新的本地变量,而不是修改外层的同名变量。

作用域规则影响

  1. 作用域层次:Python有四个作用域,分别是本地作用域(Local)、嵌套作用域(Enclosing)、全局作用域(Global)和内置作用域(Built - in)。在嵌套函数中,内层函数访问变量时,遵循LEGB规则查找变量。当内层函数对变量进行赋值操作时,会优先在本地作用域创建新变量。
  2. 不可变与可变数据类型:如果外层函数的x是可变数据类型(如列表、字典等),内层函数可以修改其内容而无需特殊声明;但如果是不可变数据类型(如整数、字符串、元组等),直接赋值就会创建新的本地变量。

修改代码使其达到预期

  1. 使用nonlocal关键字(Python 3+):如果是Python 3及以上版本,对于不可变数据类型,可以在内层函数中使用nonlocal关键字声明变量,表明要修改的是外层(非全局)作用域中的变量。
def outer():
    x = 10
    def inner():
        nonlocal x
        x = 20
    inner()
    return x
result = outer()
print(result)
  1. 利用可变数据类型特性(适用于Python 2和Python 3):将x定义为可变数据类型,如列表。
def outer():
    x = [10]
    def inner():
        x[0] = 20
    inner()
    return x[0]
result = outer()
print(result)

在Python 2中,没有nonlocal关键字,使用可变数据类型的方法是修改外层作用域变量的常用方式。