Python二级参数无法传入三级函数的问题排查
问题排查:Python嵌套函数变量引用错误
我在做学校项目时遇到了Python嵌套函数的变量引用问题。按道理嵌套函数应该能引用外层传递的参数,但这段代码里myFunc2中无法将n与0比较,报错local variable referenced before assignment。附带的doctests显示,用add1、times2、add3调用cycle(f1, f2, f3),传入0调用myFunc(n)再传入5调用myFunc2(x)能正常运行,我搞不懂为什么n参数传不到myFunc2里。目前已经用全局变量解决了,但想知道错误根源。
原代码
def cycle(f1, f2, f3): def myFunc(n): def myFunc2(x): while n > 0: if n > 0: x = f1(x) n -= 1 if n > 0: x = f2(x) n -= 1 if n > 0: x = f3(x) n -= 1 return x return myFunc2 return myFunc # 测试用例 >>> def add1(x): ... return x + 1 >>> def times2(x): ... return x * 2 >>> def add3(x): ... return x + 3 >>> my_cycle = cycle(add1, times2, add3) >>> identity = my_cycle(0) >>> identity(5) 5 >>> add_one_then_double = my_cycle(2) >>> add_one_then_double(1) 4 >>> do_all_functions = my_cycle(3) >>> do_all_functions(2) 9 >>> do_more_than_a_cycle = my_cycle(4) >>> do_more_than_a_cycle(2) 10 >>> do_two_cycles = my_cycle(6) >>> do_two_cycles(1) 19
错误原因
- 赋值操作改变作用域判定:在
myFunc2中执行n -= 1时,Python会默认将n标记为当前函数的局部变量,不再引用外层myFunc中的n。 - 执行顺序触发未定义错误:当代码运行到
while n > 0时,Python会优先在myFunc2的局部作用域查找n,但此时n还未被赋值(赋值操作在循环内部),因此抛出local variable referenced before assignment错误。 - 传入0时无报错的逻辑:当
n=0时,while循环直接跳过,不会触发n -= 1的赋值操作,Python会自动去外层作用域查找n,所以能正常运行。
正确解决方法(无需全局变量)
在myFunc2开头添加nonlocal n声明,明确告诉Python该变量引用的是外层嵌套函数myFunc中的变量,而非当前函数的局部变量。
修改后的代码:
def cycle(f1, f2, f3): def myFunc(n): def myFunc2(x): nonlocal n # 声明引用外层函数的n变量 while n > 0: if n > 0: x = f1(x) n -= 1 if n > 0: x = f2(x) n -= 1 if n > 0: x = f3(x) n -= 1 return x return myFunc2 return myFunc # 测试验证 def add1(x): return x + 1 def times2(x): return x * 2 def add3(x): return x + 3 my_cycle = cycle(add1, times2, add3) identity = my_cycle(0) print(identity(5)) # 输出5 add_one_then_double = my_cycle(2) print(add_one_then_double(1)) # 输出4 do_all_functions = my_cycle(3) print(do_all_functions(2)) # 输出9 do_more_than_a_cycle = my_cycle(4) print(do_more_than_a_cycle(2)) # 输出10 do_two_cycles = my_cycle(6) print(do_two_cycles(1)) # 输出19
内容的提问来源于stack exchange,提问作者WyWyGuy
相关产品推荐
相关产品推荐

