Python之函数-作用域和嵌套函数
作用域
- 一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域
- 每一个函数都会开辟一个作用域
作用域分类
- 全局作用域
- 在整个程序运行环境中都可见
- 全局作用域中的变量称为全局变量global
- 局部作用域
- 在函数、类等内部可见
- 局部作用域中的变量称为局部变量,其使用范围不能超过其所在局部作用域
- 也称为本地作用域local
函数嵌套
- 在一个函数中定义了另外一个函数
- 内部函数inner不能在外部直接使用,会抛NameError异常,因为它在函数外部不可见。
- 其实,inner不过就是一个标识符,就是一个函数outer内部定义的变量而已。
作用域:标识符的可见范围
- 函数开辟了一个作用域,x被限制在当前函数作用域中,对外不可见
- 全局的,函数外的变量,对内穿透
- 本地使用标识符,优先使用当前作用域
- 优先使用本地定义的局部变量,优先原则
def fn():x = 100print(x, '~~~~~~~~~~')# 定义一个函数
x# 直接执行x会提示报错
# 报错内容:NameError: name 'x' is not defined
fn()# 直接执行函数
# 返回结果:100 ~~~~~~~~~~
y = 100 # 定义一个变量y,这个y是global 全局可见
def fn2():c = 1000print(y)print(c)# y在函数外面,是全局变量,在函数内可以调用全局(global)变量
# c只在fn2函数内定义了,函数外不可直接调用,必须通过fn2函数才能调用
fn2()# 返回结果:100
# 返回结果:1000
c# 直接执行c会提示报错,原因是,c只在fn2函数中定义了,global全局中没有定义c
# 报错内容:NameError: name 'c' is not defined
函数嵌套
1. def outer():
2. o = 65
3. def inner():
4. print('in inner', o, chr(o))
5. inner()
6. print('in outer', o, chr(o)) 1. # 函数定义后在内存中开辟一块空间存放
2. # 函数outer中定义一个变量
3. # 函数定义后在内存中开辟一块空间存放
4. # inner函数中定义一个print o,inner没有从outer函数中穿透进来,chr(o)='A'
5. # 在outer函数下调用inner函数
6. # outer函数中定义一个print o,outer中本来就有变了o,chr(o)='A'
outer()# 调用了outer函数,所以inner和outer函数都被调用了
# 返回结果:in inner 65 A
# 返回结果:in outer 65 A
chr(65), chr(97), ord('A'), ord('a')# 调用了outer函数,所以inner和outer函数都被调用了
# 返回结果:('A', 'a', 65, 97)
def outer1():o = 65def inner():o = 97 # 不同语言,表现不一样print('in inner', o, chr(o)) # 'in inner' 97 ainner()print('in outer1', o, chr(o)) # 'in outer1' 65 A
outer1()# 调用了outer1函数,所以inner和outer1函数都被调用了
# 返回结果:in inner 97 a
# 返回结果:in outer1 65 A
JS风格的函数调用与结果显示。
def outer2():# o = 65def inner():o = 97print('in inner', o, chr(o))inner()print('in outer', o, chr(o))# 定义一个outer2函数
outer2()# 报错原因outer2函数中使用变量o,但是它本身没有变量o,所以报错
# 报错内容:NameError: name 'o' is not defined