Python进阶学习修改闭包内使用的外部变量

目录
  • 修改闭包内使用的外部变量
    • 错误示例:
    • 小结
  • 闭包与闭包中修改外部变量
  • 修改外部函数的变量

修改闭包内使用的外部变量

错误示例:

# 定义一个外部函数
def func_out(num1):
    # 定义一个内部函数
    def func_inner(num2):
        # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
        num1 = 10
        # 内部函数使用了外部函数的变量(num1)
        result = num1 + num2
        print("结果是:", result)
    print(num1)
    func_inner(1)
    print(num1)
    # 外部函数返回了内部函数,这里返回的内部函数就是闭包
    return func_inner
# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)

错误示例:

# 定义一个外部函数
def func_out(num1):
    # 定义一个内部函数
    def func_inner(num2):
        # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
        nonlocal num1  # 告诉解释器,此处使用的是 外部变量a
        # 修改外部变量num1
        num1 = 10
        # 内部函数使用了外部函数的变量(num1)
        result = num1 + num2
        print("结果是:", result)
    print(num1)
    func_inner(1)
    print(num1)
    # 外部函数返回了内部函数,这里返回的内部函数就是闭包
    return func_inner
# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)

小结

修改闭包内使用的外部函数变量使用 nonlocal 关键字来完成。

闭包与闭包中修改外部变量

在函数嵌套的前提下,内部函数引用了外部函数的变量,并且外部函数返回(return)了内部函数,即外部函数返回了引用了外部函数变量的内部函数,这时我们称内部函数为闭包。 比如说如下例子:

# 外部函数
def func_outer(a):
    # 内部函数
    def func_inner(b):
        c = a + b
        return c
    return func_inner
# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

在这里,f就叫做闭包的实例,func_inner函数就叫做闭包 此时执行结果如下:

可以见得,f里封存了外部函数的变量1,当闭包实例建立出来,再实行闭包实例,此时相当于1+2和1+3,得到了如上结果。 使用debug可以查看到,执行完f = func_outer(1)代码后,此时一个函数对象已经保存在内存当中:

当一开始步入代码num1 = f(2)(实行闭包)后:

一个外部函数.内部函数的对象存储在了内存中,注意:在执行完f = func_outer(1)并没有立即产生这样一个对象,而是在调用时才会产生该对象 这时,再步入内部函数:

这样c=3便出现了,此时在打印c就会出现3,4的出现与3的原理一样

修改外部函数的变量

代码如下:

# 外部函数
def func_outer(a):
    # 内部函数
    def func_inner(b):
        nonlocal a
        a = 2
        c = a + b
        return c
    return func_inner
# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

多了一行nonlocal a 这里的nonlocal关键字是声明我这里用的是外部的a,而不是自己新定义的局部变量a

以上就是Python进阶学习修改闭包内使用的外部变量的详细内容,更多关于Python修改闭包内外部变量的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python新手如何进行闭包时绑定变量操作

    搞不清楚在闭包(closures)中Python是怎样绑定变量的 看这个例子: >>> def create_multipliers(): ... return [lambda x : i * x for i in range(5)] >>> for multiplier in create_multipliers(): ... print multiplier(2) ... 期望得到下面的输出: 0 2 4 6 8 但是实际上得到的是: 8 8 8 8 8 实例扩展:

  • Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作.分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多. demo.py(闭包): # 闭包,分割作用域. 外层函数内部嵌套内部函数,外层函数分割变量作用域,并返回内部函数的引用. # 外层函数负责分割作用域,内层函数才是闭包提供的功能. 外层函数返回内层函数的引用,供外部使用. def my_line(k, b): # k,b只在my_line函数以及creat

  • Python中闭包和自由变量的使用与注意事项

    目录 1.定义 2.nonlocal关键字 3.注意事项 4.使用场景 总结 1.定义 在函数内部再定义一个函数,并且这个函数用到了外部函数的变量(LEGB),最后返回新建函数的函数名索引,那么将这样的能够访问其定义时所在的作用域的函数以及用到的一些变量称之为闭包.被引用的非全局变量也称为自由变量 .这个自由变量保存在外部函数的只读属性 __closure__ 中,会与内层函数产生一个绑定关系,也就是自由变量将不会在内存中轻易消失.如下例所示: # 计算函数被调用的次数 def counter(

  • Python编程中闭包的变量作用域问题解析

    目录 闭包 闭包中的变量 闭包 ​ 在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数.而这样,就造成了我们的函数嵌套问题.外面的函数相对于里面的函数而言是外函数(outer function),而里面的我们叫他内函数(inner function). def outerFunction(): #外函数 def innerFunction(): #内函数 x = 1 return x return innerFunction #返回值是

  • Python进阶学习修改闭包内使用的外部变量

    目录 修改闭包内使用的外部变量 错误示例: 小结 闭包与闭包中修改外部变量 修改外部函数的变量 修改闭包内使用的外部变量 错误示例: # 定义一个外部函数 def func_out(num1): # 定义一个内部函数 def func_inner(num2): # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1 num1 = 10 # 内部函数使用了外部函数的变量(num1) result = num1 + num2 print("结果是:", resu

  • Python进阶学习之带你探寻Python类的鼻祖-元类

    Python是一门面向对象的语言,所以Python中数字.字符串.列表.集合.字典.函数.类等都是对象. 利用 type() 来查看Python中的各对象类型 In [11]: # 数字 In [12]: type(10) Out[12]: int In [13]: type(3.1415926) Out[13]: float In [14]: # 字符串 In [15]: type('a') Out[15]: str In [16]: type("abc") Out[16]: str

  • python 进阶学习之python装饰器小结

    装饰器总结 什么是装饰器?处理函数的函数,加一个功能,但是不影响原来函数的内部结构生活中的例子:给手机加一个外壳,外壳保护了手机 装饰器有什么用?增强函数的功能 装饰器使用场景增加被装饰函数的行为代码复用 一个函数接收另一个函数作为参数,这种函数称之为高阶函数. 函数的重要特性 1.在python中,一切皆为对象,所以函数也是一个对象,从而函数可以赋值给变量. 定义一个add函数,函数的功能是实现两个数相加 系统为函数分配了一个内存地址:0x00000000021B3798 2.一个函数可以作为

  • Python可视化学习之matplotlib内置单颜色

    目录 1.matplotlib支持的颜色格式 2.matplotlib颜色使用方法 3.matplotlib内置单颜色色号 'BASE_COLORS'色号 'BASE_COLORS'色图 TABLEAU_COLORS色号 TABLEAU_COLORS色图 CSS4_COLORS色号 CSS4_COLORS色图 XKCD_COLORS色号 XKCD_COLORS色图 1.matplotlib支持的颜色格式 1.RGB 或者 RGBA 元组格式颜色 元组中浮点型数值位于 [0, 1] 之间,e.g(

  • Python进阶学习之特殊方法实例详析

    前言 最近在学习python,学习到了一个之前没接触过的--特殊方法. 什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化的方法$__init__$,类似于java中的构造器,这个就是特殊方法,也叫作魔术方法.简单来说,特殊方法可以给你设计的类加上一些神奇的特性,比如可以进行python原生的切片操作,迭代.连乘操作等.在python中,特殊方法以双下划线开始,以双下划线结束. 一个大例子 数学中有一个表示数的概念叫做向量,但是python中的数据类型却没有.我们来设法用p

  • Python深入学习之闭包

    闭包(closure)是函数式编程的重要的语法结构.函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式).在面向过程编程中,我们见到过函数(function):在面向对象编程中,我们见过对象(object).函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability).闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性. 不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范

  • Python可视化学习之seaborn调色盘

    目录 1.color_palette()函数 2.seaborn可用调色盘 choose_colorbrewer_palette函数 Qualitativecolorpalettes Sequentialcolorpalettes Divergingcolorpalettes 1.color_palette() 函数 该函数是seaborn选取颜色关键函数 color_palette() will accept the name of any seaborn palette or matplot

  • python修改字典内key对应值的方法

    本文实例讲述了python修改字典内key对应值的方法.分享给大家供大家参考.具体实现方法如下: d2 = {'spam': 2, 'ham': 1, 'eggs': 3} # make a dictionary print d2 # order is scrambled d2['ham'] = ['grill', 'bake', 'fry'] # change entry print d2 运行结果如下: {'eggs': 3, 'ham': 1, 'spam': 2} {'eggs': 3,

  • python爬虫学习笔记之Beautifulsoup模块用法详解

    本文实例讲述了python爬虫学习笔记之Beautifulsoup模块用法.分享给大家供大家参考,具体如下: 相关内容: 什么是beautifulsoup bs4的使用 导入模块 选择使用解析器 使用标签名查找 使用find\find_all查找 使用select查找 首发时间:2018-03-02 00:10 什么是beautifulsoup: 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.(官方) beautif

  • Python进阶之import导入机制原理详解

    目录 前言 1. Module组成 1.1 Module 内置全局变量 2. 包package 2.1 实战案例 3.sys.modules.命名空间 3.1 sys.modules 3.2 命名空间 4. 导入 4.1 绝对导入 4.2 相对导入 4.3 单独导入包 5. import运行机制 5.1 标准import,顶部导入 5.2 嵌套import 前言 在Python中,一个.py文件代表一个Module.在Module中可以是任何的符合Python文件格式的Python脚本.了解Mo

随机推荐