python闭包
闭包:python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象
def fun1(x):
def fun2(y):
return x*y
return fun2
c= fun1(2)
c(4)
其中fun2()是个闭包
注意事项:
1. 闭包中不能修改外部作用域中的局部变量
def foo():
m=0
def foo1():
m=1
print m
print m
foo1()
print m
foo()0
1
0
2.以下这段代码是在python中使用闭包时一段经典的错误代码
?
1 2 3 4 5 6 | def
foo():
a
=
1
def
bar():
a
=
a
+
1
return
a
return
bar |
?
1 2 3 4 5 6 | >>> c
=
foo() >>>
print
c() Traceback (most recent call last):
File
""
, line
1
,
in
File
""
, line
4
,
in
bar UnboundLocalError: local variable
'a'
referenced before assignment |
?
1 2 3 4 5 6 | def
foo():
a
=
[
1
]
def
bar():
a[
0
]
=
a[
0
]
+
1
return
a[
0
]
return
bar |
3.还有一个容易产生错误的事例也经常被人在介绍python闭包时提起,我一直都没觉得这个错误和闭包有什么太大的关系,但是它倒是的确是在python函数式编程是容易犯的一个错误,我在这里也不妨介绍一下。先看下面这段代码
?
1 2 | for
i
in
range
(
3
):
print
i |
?
1 2 3 4 5 6 | flist
=
[] for
i
in
range
(
3
):
def
foo(x):
print
x
+
i
flist.append(foo) for
f
in
flist:
f(
2
) |
解决方法也很简单,改写一下函数的定义就可以了。
?
1 2 3 | for
i
in
range
(
3
):
def
foo(x,y
=
i):
print
x
+
y
flist.append(foo) |
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)
- Python|Python 9.20