详解python函数的闭包问题(内部函数与外部函数详述)

作者:AngelovLee 时间:2023-01-22 20:53:01 

python函数的闭包问题(内嵌函数)


>>> def func1():
...   print ('func1 running...')
...   def func2():
...       print ('func2 running...')
...   func2()
...
>>> func1()
func1 running...
func2 running...

内部函数func2作用域都在外部函数func1作用域之内
如果试图在外部函数的外部调用内部函数将会报错


>>> func2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'func2' is not defined

关于python的闭包问题

如果试图在一个内部函数里对外部作用域(不包括外部函数的外部作用域)的变量进行引用,内部函数就会被认为是闭包


>>> def FuncX(x):
...   def FuncY(y):
...       return x*y
...   return FuncY

对于FuncY函数来说,对在FuncX函数的整个作用域(FuncY函数的非全局作用域的外部作用)的变量x进行引用,自此就可以说FuncY函数就是所谓的闭包


>>> f = FuncX(8)
>>> f
<function FuncY at 0x7f3a436fc2a8>
>>> type(f)
<type 'function'>
>>> f(10)
80
>>> FuncX(7)(8)
56

由于闭包本身是基于内部函数这一概念而来,所以不能在外部函数的外部作用域对内部函数进行调用


>>> FuncY(8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'FuncY' is not defined

既然是基于内部函数这一概念而来,自然对于内部函数来说对引用外部函数作用域内的变量进行修改,将会启动解释器的屏蔽机制


>>> def Func1():
...   x = 233
...   def Func2():
...       x *=x
...       return x
...   return Func2()
...
>>> Func1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in Func1
File "<stdin>", line 4, in Func2
UnboundLocalError: local variable 'x' referenced before assignment

x*=x的左值此时是内部函数作用域里的变量,此时试图将没有定义的数据进行平方操作,因此报错


>>> def Func1():
...   x = 233
...   def Func2():
...       x = 321
...       return x
...   return Func2()
...
>>> Func1()
321

内部函数创建x变量并且屏蔽外部函数作用域内的x变量

python3之前的解决办法

应用容器类型(list,tuple之类的)存放外部函数作用域的变量从而不会被屏蔽机制屏蔽掉,因为容器类型不是存放在栈里面


>>> def Func1():
...   x = [233]
...   def Func2():
...       x[0] *= x[0]
...       return x[0]
...   return Func2()
...
>>> Func1()
54289

python3之后的解决办法:nonlocal关键字


>>> def Func1():
...   x = 233
...   def Func2():
...   nonlocal x
...       x *= x
...       return x
...   return Func2()
...
>>> Func1()
54289

以上所述是小编给大家介绍的python函数的闭包问题详解整合网站的支持!

来源:https://blog.csdn.net/ChangerJJLee/article/details/52598629

标签:python,闭包
0
投稿

猜你喜欢

  • 在Tensorflow中查看权重的实现

    2022-05-02 20:14:56
  • Python判断是否json是否包含一个key的方法

    2023-02-25 02:58:40
  • Go中JSON解析时tag的使用

    2024-05-09 09:31:52
  • Python全栈之递归函数

    2021-04-05 16:44:54
  • PHP缓存集成库phpFastCache用法

    2023-11-14 02:35:19
  • Oracle中的分析函数汇总

    2024-01-20 05:59:38
  • asp textarea 多行数组分割处理方法

    2011-03-03 10:55:00
  • JavaScript几种弹窗事件的使用

    2023-08-24 15:59:08
  • Sql Server在安装时提示挂起的解决方法

    2009-01-13 13:55:00
  • PHP模拟asp中response类实现方法

    2024-06-05 09:39:32
  • Golang-如何判断一个 interface{} 的值是否为 nil

    2024-02-17 10:08:10
  • python如何删除字符串最后一个字符

    2022-06-07 14:14:04
  • django admin后台添加导出excel功能示例代码

    2023-10-19 10:43:48
  • git如何还原到某次commit并强制推送远程

    2022-07-25 16:45:40
  • php利用cookies实现购物车的方法

    2023-07-23 08:32:37
  • Django如何实现内容缓存示例详解

    2022-02-23 15:33:01
  • python实现蒙特卡罗模拟法的实践

    2023-08-11 02:22:02
  • selenium3.0+python之环境搭建的方法步骤

    2023-03-20 06:00:22
  • 基于Python的Houdini插件开发过程详情

    2023-11-28 17:28:02
  • 搭建一个开源项目两种方式安装git的详细教程

    2022-10-24 13:04:55
  • asp之家 网络编程 m.aspxhome.com