1、全局作用域函数嵌套
def three_max(a, b, c): t = two_max(a, b) # 函数嵌套调用two_max return t if t > c else c def two_max(a, b): return a if a > b else b print(three_max(1, 2, 3))
程序执行,按照从下往下的顺序,把变量、函数名加入到命名空间,如果还未加入到命名空间,就调用了函数,将会报错。
如上程序,如果把three_max的调用,交换到two_max的前面,将会报错:NameError: name ‘two_max‘ is not defined
def three_max(a, b, c): t = two_max(a, b) # 函数嵌套调用two_max return t if t > c else c print(three_max(1, 2, 3)) # NameError: name ‘two_max‘ is not defined def two_max(a, b): return a if a > b else b
2、内部函数使用外部函数
a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): a = 3 print("inner2:", a) # 3 inner2() print("inner:", a) # 2 inner() print("outer:", a) # 1 outer() print(a)
嵌套定义时,每个局部都有自己的命名空间,互相不干扰
子函数定义了和父函数相同的变量,其值都为独立的,修改不影响父函数
global
a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): global a # 修改的是全局的变量数据 a = 3 print("inner2:", a) # 3 inner2() print("inner:", a) # 2 inner() print("outer:", a) # 1 outer() print(a) # 3
global定义的变量,是全局命名空间的变量
不影响局部的变量
nonlocal
a = 1 def outer(): # nonlocal a # 只能对局部作用域变量有效,在最后一个局部报错SyntaxError: no binding for nonlocal ‘a‘ found a = 1 def inner(): # nonlocal a a = 2 def inner2(): nonlocal a a = 3 print("inner2:",a) # 3 inner2() print("inner:", a) # 3 nonlocal找到上一层的变量进行了更改 inner() print("outer:", a) # 1 outer() print(a) # 定义nonlocal后,全局变量不变依然为1
nonlocal寻找离当前函数最近的一层局部变量
声明了nonlocal的局部变量的改动,会影响最近一层的函数的局部变量
原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11646906.html
时间: 2024-10-11 17:55:55