函数闭包

作者:管理员 发布时间:2020-12-25 15:39

函数闭包是一个面试中经常提及的词,核心考点是变量的作用域问题,也算编程的基本功。


变量的作用域

Python编程,函数、类(def/class/lambda)内部都有独立的变量作用域;

在内部,可以访问外部的变量,但外部无法访问其内部的变量。

g = 1  #全局的
def fun():
    g = 2 #局部的
    return g

print fun()
# 结果为2
print g
# 结果为1

内部定义了与外部一样的变量时,内部就只能使用内部的变量,外部的不会受影响。

g = 1  #全局的
def fun():
    print(g)	# 报错
    g = 2 #局部的
    return g

print(fun())

print (g)

上面代码在打印g时会报错,因为内部声明了g,而这个g还没赋值就打印了,会报空指针错误。

if/elif/else/ try/except for/while等类型的缩进,没有独立作用域;

if True:
    variable = 100
    print (variable)
print ("******")
print (variable)
#代码的输出为:

100
******
100


全局变量

我们在多线程中使用过的全局变量,还有如下作用:

x = 0
def outer():
    x = 1
    def inner():
        global x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

#输出结果
# inner: 2
# outer: 1
# global: 2


闭包

    我们在开发时,会将一些功能模块封装到一个函数中,这个函数中包含内部的变量与嵌套函数,内部自成体系;这样的形势被称作闭包。

    由于内部结果多层,还涉及内部与外部参数的传递,很容易混淆,成为了面试经常会问到的技术点。

x = 0
def outer():
    x = 1
    def inner():
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

#输出结果
# inner: 2
# outer: 1
# global: 0


在闭包中,使用包内的全局变量,使用nonlocal关键词

x = 0
def outer():
    x = 1
    def inner():
		nonlocal x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

#输出结果
# inner: 2
# outer: 2
# global: 0



标签:
Copyright © 2020 万物律动 旗下 AI算法狮 京ICP备20010037号-1
本站内容来源于网络开放内容的收集整理,并且仅供学习交流使用;
如有侵权,请联系删除相关内容;