python全栈闯关--10-2函数的嵌套和作用域

Posted 熊熊闯深林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python全栈闯关--10-2函数的嵌套和作用域相关的知识,希望对你有一定的参考价值。

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的局部变量的改动,会影响最近一层的函数的局部变量

 

以上是关于python全栈闯关--10-2函数的嵌套和作用域的主要内容,如果未能解决你的问题,请参考以下文章

python 全栈 python基础 作用域 函数嵌套 闭包

Python全栈__动态参数名称空间作用域作用域链加载顺序函数的嵌套globalnonlocal

Python全栈之路Day19

ParisGabriel:Python全栈工程师(0基础到精通)教程 第十五课(函数嵌套变量作用域)

python全栈闯关--12-装饰器进阶

Python全栈之路Day20