首页 > 编程语言 > 详细

python 闭包

时间:2018-05-15 00:54:04      阅读:182      评论:0      收藏:0      [点我收藏+]

# python 闭包 #

1.什么是闭包

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,
那么[内部函数和该变量]就构成了闭包(closure)。

def out(x):
    def inner():
        print(x)
    return inner

inner 和 x构成一个闭包

2.闭包使用中的坑

闭包中不能直接修改外部函数的局部变量

(如果使用类似x = x + 1修改x的值,会直接报错UnboundLocalError
原因是企图修改x会让函数认为x是局部变量,在执行=右边的x + 1时找不到变量x)

def out():
    x = 0
    def inner():
        x = 1
        print(x)
    print(x)  # 显示改变前变量的值
    inner()  # 执行inner函数
    print(x)  # 显示改变后的变量值
    return inner

输出0 1 0

如果非要修改外部函数局部变量的值

需要使用nonlocal

def out():
    x = 0
    def inner():
        nonlocal x
        x = 1
        print(x)
    print(x)  # 显示改变前变量的值
    inner()  # 执行inner函数
    print(x)  # 显示改变后的变量值
    return inner

输出0 1 1

当闭包中引用了循环变量时

def out():
    fs = []
    for i in range(1, 4):
        i = i

        def inner(x):
            return i + x

        fs.append(inner)
    return fs


f1, f2, f3 = out()
print(f1(1))
print(f2(1))
print(f3(1))

输出4 4 4而不是2 3 4
闭包中的函数在被调用时才执行,
当调用inner时外层函数out已经执行完了,
但是变量i不会销毁,因为函数inner需要使用变量i,
而此时变量i的值为3,所以输出4 4 4
想要获得2 3 4,需要在每一次循环时都记录变量i的值

def out():
    fs = []
    for i in range(1, 4):
        i = i

        def inner(x, y=i):
            return x + y

        fs.append(inner)
    return fs


f1, f2, f3 = out()
print(f1(1))
print(f2(1))
print(f3(1))

输出2 3 4

python 闭包

原文:https://www.cnblogs.com/spirit911/p/9038762.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!