面试题答案
一键面试可能原因
- 在Python中,默认情况下,内层函数无法直接修改外层函数的变量。如果内层函数中使用一个变量,Python首先会在其本地作用域查找,如果找不到,会依次向上层作用域查找,但如果内层函数试图直接对一个上层作用域的变量赋值,Python会创建一个新的本地变量,而不是修改外层的同名变量。
作用域规则影响
- 作用域层次:Python有四个作用域,分别是本地作用域(Local)、嵌套作用域(Enclosing)、全局作用域(Global)和内置作用域(Built - in)。在嵌套函数中,内层函数访问变量时,遵循LEGB规则查找变量。当内层函数对变量进行赋值操作时,会优先在本地作用域创建新变量。
- 不可变与可变数据类型:如果外层函数的
x
是可变数据类型(如列表、字典等),内层函数可以修改其内容而无需特殊声明;但如果是不可变数据类型(如整数、字符串、元组等),直接赋值就会创建新的本地变量。
修改代码使其达到预期
- 使用
nonlocal
关键字(Python 3+):如果是Python 3及以上版本,对于不可变数据类型,可以在内层函数中使用nonlocal
关键字声明变量,表明要修改的是外层(非全局)作用域中的变量。
def outer():
x = 10
def inner():
nonlocal x
x = 20
inner()
return x
result = outer()
print(result)
- 利用可变数据类型特性(适用于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
关键字,使用可变数据类型的方法是修改外层作用域变量的常用方式。