- def get_math_func(type, nn) :
- # 定义一个计算平方的局部函数
- def square(n) : # ①
- return n * n
- # 定义一个计算立方的局部函数
- def cube(n) : # ②
- return n * n * n
- # 定义一个计算阶乘的局部函数
- def factorial(n) : # ③
- result = 1
- for index in range(2, n + 1) :
- result *= index
- return result
- # 调用局部函数
- if type == "square" :
- return square(nn)
- elif type == "cube":
- return cube(nn)
- else:
- return factorial(nn)
- print(get_math_func("square", 3)) # 输出9
- print(get_math_func("cube", 3)) # 输出27
- print(get_math_func("", 3)) # 输出6
- def foo ():
- # 局部变量name
- name = 'Charlie'
- def bar ():
- # 访问bar函数所在的foo函数的name局部变量
- print(name) # Charlie
- name = '孙悟空'
- bar()
- foo()
UnboundLocalError: local variable 'name' referenced before assignment
该错误是由局部变量遮蔽局部变量导致的,在 bar() 函数中定义的 name 局部变量遮蔽了它所在 foo() 函数内的 name 局部变量,又因为 bar() 函数中的 name 局部变量定义在 print() 输出函数之后,使的 print(name) 执行时找不到合适的 name,因此导致程序报错。
- def foo ():
- # 局部变量name
- name = 'Charlie'
- def bar ():
- nonlocal name
- # 访问bar函数所在的foo函数的name局部变量
- print(name) # Charlie
- name = '孙悟空'
- bar()
- foo()
nonlocal 和前面介绍的 global 功能大致相似,区别只是 global 用于声明访问全局变量,而 nonlocal 用于声明访问当前函数所在函数内的局部变量。
联系客服