详解python函数的闭包问题(内部函数与外部函数详述)
作者:AngelovLee 发布时间:2023-01-22 20:53:01
标签:python,闭包
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
0
投稿
猜你喜欢
- 在对于python中类的使用上,我们分出了子类和父类两种。对于这二者之间的关系,我们可以简单理解为继承。不过python中加入了实例的讨论,
- 前言作为Web开发人员,在 Web浏览器中存储数据以改善用户体验和提升Web应用程序性能是非常常见的。在大多数情况下,可供我们使用就是Loc
- 本文详细讲述了Python使用MySQLdb for Python操作数据库的方法,分享给大家供大家参考。具体如下:一般来说网站就是要和数据
- 本文实例为大家分享了python遍历文件目录、批量处理同类文件的具体代码,供大家参考,具体内容如下目录操作1、获取当前目录import os
- 创建 NumPy ndarray 对象NumPy 用于处理数组,NumPy 中的数组对象称为 ndarray。我们可以使用 array()
- Ursina是一个3D引擎,初步使用方法,见文章:详解Python 3D引擎Ursina如何绘制立体图形了解完Ursina的初步用
- 本文将讲述vue-cli+vux-scroller实现移动端的上拉加载功能:纠错声明:网上查阅资料看到很多人都将vux和vuex弄混,在这里
- 网页颜色变黑白代码国务院决定,为表达全国各族人民对青海玉树地震遇难同胞的深切哀悼,2010年4月21日举行全国哀悼活动,全国和驻外使领馆下半
- 第一章:基本的圆角框第二章:透明圆角化背景图片第三章:圆角化图片 第四章:CSS圆角框组件 V1.0在上面的案例中,我只给出最为原始的圆角框
- 一、引言属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算
- PDOStatement::bindColumnPDOStatement::bindColumn — 绑定一列到一个 PHP 变量(PHP
- 实例如下:import sysdef print_all(module_): modulelist = dir(module_)
- 基于python3基础课程,编写名片管理系统训练,有利于熟悉python基础代码的使用。cards_main.py#! /usr/bin/p
- 一、创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置。也就是通过自动生成代码来建立一个Django项目--一个Dja
- 源代码:# coding=utf-8import loggingimport osimport timeLEVELS={'debug
- 引用Nmap库实现扫描功能,本节课比较简单一看就会。编写环境:Python2.x编写:首先安装Nmap程序,并添加环境变量pip insta
- 前言return语句用于退出函数,向调用方返回一个表达式。return在不带参数的情况下(或者没有写return语句),默认返回None。N
- 如何显示数据库的结构?<html><head><meta http-equiv="Cont
- 创作思路:主要还是想尝试做点稍微不同于整天为迎合客户而做的东西.然后闲时就开始构思,比如坐车,走路什么的.看到有一些复古手机的相关图,就想到
- 1. 指针区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。要搞明白Go语言中的指针需要先知道3个概念:指针地址、指