iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python编程中闭包的变量作用域问题解析
  • 611
分享到

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

2024-04-02 19:04:59 611人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录闭包闭包中的变量闭包 ​ 在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数。而这样,就造成了我们的函数嵌

闭包

​ 在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数。而这样,就造成了我们的函数嵌套问题。外面的函数相对于里面的函数而言是外函数(outer function),而里面的我们叫他内函数(inner function)。


def outerFunction(): #外函数
    def innerFunction(): #内函数
        x = 1
        return x
    return innerFunction #返回值是一个函数
a = outerFunction()
print(a)

这里我们打印 a 的值得时候,实际上打印的是我们的返回函数的地址 :

<function outerFunction.<locals>.innerFunction at 0x0000019C278C0E50>

​ 一般情况下,我们在使用函数作为返回值得时候,我们会在内函数中使用我们外函数中的变量,这种情况就会产生一个有意思的事情了。内函数会被返回给外部的其他调用者,而我们的变量是在我们的外函数中定义的。此时,我们的变量的作用域会发生怎样的变化呢?

测试


def outerFunction(x): #外函数
    y = 10
    def innerFunction(): #内函数
        return x + y
    return innerFunction #返回值是一个函数
a = outerFunction(10)
print(a())

​打印:

20

​ 这里可以看到,我们的在给 a 赋值的时候,同时给外函数传进去了一个值10,然后,我们直接把 a() 打印出来,此时,我们的 a 返回了 20,说明我们的变量和参数在进入内函数后,我们的内函数会保留这个变量的值。

​ 这里,我们把这种现象叫做“闭包(Closure)”,我试着多次返回这个内函数,看看他们的地址是否一致:


def outerFunction(x): #外函数
    y = 10
    def innerFunction(): #内函数
        return x + y
    return innerFunction #返回值是一个函数
a = outerFunction(10)
b = outerFunction(20)
c = outerFunction(30)
print(a())
print(b())
print(c())
print(a)
print(b)
print(c)

​ 打印:

20
30
40
<function outerFunction.<locals>.innerFunction at 0x0000020C480C0DC0>
<function outerFunction.<locals>.innerFunction at 0x0000020C480C0D30>
<function outerFunction.<locals>.innerFunction at 0x0000020C480CD280>

​ 这里我们可以看到每个 innerFunction 的地址都不同,当我们多次调用返回函数的时候,每调用一次,我们的返回函数就会新创建一个函数给我们的变量。

​ 那么,如果我们在外函数里面多次调用我们的内函数,我们的外函数的变量的作用域是什么样的呢?

​ 我们测试一下:


def outerFunction(x): #外函数
    L=[] #定义一个List 
    y = 10
    for i in range(1, 4):
        def innerFunction(): #内函数
            return (x + y) * i #使用我们外函数得变量
        print(innerFunction()) #打印内函数返回得值
        #print(innerFunction)
        L.append(innerFunction) #把内函数添加到我们得List中
    return L #返回这个List
a = outerFunction(10)
print(a[0])
print(a[1])
print(a[2])
print(a[0]())
print(a[1]())
print(a[2]())

​ 看打印:

20
40
60
<function outerFunction.<locals>.innerFunction at 0x00000274AD6B0E50>
<function outerFunction.<locals>.innerFunction at 0x00000274AD6BD040>
<function outerFunction.<locals>.innerFunction at 0x00000274AD6BD3A0>
60
60
60

​ 这里我们可以看到一个有意思得现象:

​ 当我们在我们的函数内多次调用我们的内函数,并把它的返回值打印出来的时候,我们可以看到这个值是正常的(依次递增)。而如果我们把这个内函数传递到我们的 List 中,在函数外部调用它的时候,我们的函数的返回值全部变成了 60 也就是他们的只得到了我们外函数中变量的最终的值。这个就是我们的闭包特有的现象。

闭包中的变量

​ 一般情况下,当一个函数结束的时候,在内存中,我们这个函数内部的局部变量会连同这个函数一起被释放掉。

​ 但是,当我们这个函数包含闭包的时候,也就是说,当这个函数的返回值是一个函数的引用的时候。此时,当这个函数结束时,由于它内部的局部变量需要被释放掉,因此,它会把这个变量的值给传递给它所要返回的这个函数的内部。正是因为这样,当我们在外部调用我们的返回函数的时候,我们会看到它使用的变量全都是这个变量在函数内的最终的值,因为这个变量是这个外函数在结束的时候才传递给我们的返回函数的。而此时,我们函数内的变量只能有一个值。

​ 但是,我们可以使用另一个办法来规避这种情况:


def outerFunction(x): #外函数
    L=[] #定义一个List 
    y = 10
    def innerFunction(i): #内函数
        def f():
            return (x + y) * i #使用我们外函数得变量
        return f
    for i in range(1, 4):
        print(innerFunction(i)()) #打印内函数中的内函数的返回值
        L.append(innerFunction(i)) #把内函数添加到我们得List中
    return L #返回这个List
a = outerFunction(10)
print(a[0])
print(a[1])
print(a[2])
print(a[0]())
print(a[1]())
print(a[2]())

​ 打印如下:

20
40
60
<function outerFunction.<locals>.innerFunction.<locals>.f at 0x00000155B0F80040>
<function outerFunction.<locals>.innerFunction.<locals>.f at 0x00000155B0F803A0>
<function outerFunction.<locals>.innerFunction.<locals>.f at 0x00000155B0F80430>
20
40
60

​ 这里我们可以看到我们在外部调用的时候,函数的返回值和在内部调用的返回值是一样的。那么我们分析一下这个函数的执行过程以及函数内的变量的作用域情况。

​ 首先,我们在我们由于的内函数的基础又添加了一层内函数 f() ,并且,在这个内函数里面,我们使用了外部的内函数 innerFunction 的参数作为了返回值。然后,我们在 for 循环内部把我们的 innerFunction 这个函数的返回值添加进来我们的 List 里面。

​ 这里我们应该已经发现了。在 for 循环内部,当我们把 innerFunction 的返回值 f 添加到我们的 List 中的时候,由于 innerFunction 相对于函数 f() 而言,f() 是属于 innerFunction 的内函数的,因此,当我们返回 f() 这个函数的时候,此时,f() 函数内部使用的值就是它的最终值了,而此时,我们的 innerFunction 函数还在 for 循环内部,因此,在循环内部,每次调用我们的 innerFunction 的返回值时,我们的传递到我们的 f() 函数中的值就是我们的最终值了。

​ 此时,即使是我们在外部调用这个 f() 函数,它返回的值和内部调用时也是一样的。

以上就是python编程中闭包的变量作用域问题解析的详细内容,更多关于Python闭包中变量作用域的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python编程中闭包的变量作用域问题解析

本文链接: https://www.lsjlt.com/news/155084.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python编程中闭包的变量作用域问题解析
    目录闭包闭包中的变量闭包 ​ 在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数。而这样,就造成了我们的函数嵌...
    99+
    2024-04-02
  • python 闭包中引用的变量值变更问题
    python的闭包当内层函数引用外层函数的局部变量时,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。如下:def count():     fs = []     for i in range(1, 4):         de...
    99+
    2023-01-31
    包中 变量值 python
  • JavaScript的闭包与变量作用域介绍
    这篇文章主要讲解了“JavaScript的闭包与变量作用域介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的闭包与变量作用域介绍”吧!...
    99+
    2024-04-02
  • 【6】装饰器、闭包、偏函数、变量作用域问
            【一】、装饰器思想 装饰器是其实想增加一个函数的功能,但是又不想变动原来函数的代码,就用装饰器。 比如:我们用别人的一个函数,又不是很满意,所以用装饰器装饰一下即可。   def fun1(): print(...
    99+
    2023-01-30
    变量 函数 作用
  • Python中变量的作用域详解
    目录1、作用于的概念2、局部变量3、全局变量4、变量的查找5、作用域中可变数据类型变量6、多函数程序执行流程总结1、作用于的概念 变量作用域指的是变量生效的范围,在Python中一共...
    99+
    2024-04-02
  • Python中变量的作用域实例分析
    这篇“Python中变量的作用域实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中变量的作用域实例分析”文...
    99+
    2023-06-29
  • Python中变量的作用域
    一、变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def n2(): a = 1 ...
    99+
    2023-01-30
    变量 作用 Python
  • JavaScript中变量作用域及内存问题的示例分析
    这篇文章给大家分享的是有关JavaScript中变量作用域及内存问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。学习要点:1.变量及作用域2.内存问题JavaScri...
    99+
    2024-04-02
  • go语言中闭包共享变量问题示例分析
    这篇文章将为大家详细讲解有关go语言中闭包共享变量问题示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。直接看代码和注释:package mainimport ( &nb...
    99+
    2023-06-14
  • 闭包如何解决jQuery中AJAX的外部变量问题
    这篇文章主要为大家展示了“闭包如何解决jQuery中AJAX的外部变量问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“闭包如何解决jQuery中AJAX的外部...
    99+
    2024-04-02
  • Python变量的作用域详解
    目录总结每个变量都有自己的作用域,在作用域外使用该变量非法 函数体内的变量为函数的局部变量,在函数体外不可使用 >>>def f(): x=5 >&...
    99+
    2024-04-02
  • Python变量的作用域举例分析
    本篇内容主要讲解“Python变量的作用域举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python变量的作用域举例分析”吧!函数体内的变量为函数的局部变量,在函数体外不可使用>&...
    99+
    2023-06-21
  • golang函数闭包和局部变量作用域的关系
    答案:go 中的闭包可以访问其定义作用域外的变量,即使这些变量超出函数的定义范围。详细描述:局部变量的作用域限于其声明的函数或块中。闭包包含函数代码和对周围作用域变量的引用。闭包可以访问...
    99+
    2024-04-23
    golang 闭包 作用域
  • 解析Golang函数变量的作用域
    Golang函数变量作用域解析,需要具体代码示例Golang是一种开源的静态类型编程语言,注重效率和简洁,其函数变量作用域的解析机制也是开发者需要了解的重要内容之一。本文将介绍Golang中函数变量的作用域以及与其相关的规则,同时提供代码示...
    99+
    2023-12-23
    作用域 解析 Golang函数变量
  • JavaScript中变量的作用域详解
    一、变量的分类 在JavaScript中变量分为两种: 全局变量局部变量 二、变量的作用域 1、局部变量的作用域 局部变量:在函数内部定义的变量称为局部变量,其作用域为该函数内部,在...
    99+
    2024-04-02
  • Shell中变量作用域的示例分析
    这篇文章主要为大家展示了“Shell中变量作用域的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Shell中变量作用域的示例分析”这篇文章吧。前言众所周知Shell 中的变量只作用于当前...
    99+
    2023-06-09
  • JavaScript中变量的作用域实例分析
    本篇内容主要讲解“JavaScript中变量的作用域实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中变量的作用域实例分析”吧!一、变量的分类在JavaScript中变...
    99+
    2023-06-29
  • Python中变量的作用域如何使用
    前言变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的 “有效范围” 将变量分为 “全局变量” 和 “局部变量”。一、局部变量局部变量是指在函数内部定义并使用的变量,它只在函数内部...
    99+
    2023-05-14
    Python
  • Python中变量的作用域怎么使用
    这篇文章主要介绍“Python中变量的作用域怎么使用”,在日常操作中,相信很多人在Python中变量的作用域怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中变量的作用域怎么使用”的疑惑有所...
    99+
    2023-07-06
  • Python中闭包与lambda的作用域怎么写
    这篇文章主要介绍“Python中闭包与lambda的作用域怎么写”,在日常操作中,相信很多人在Python中闭包与lambda的作用域怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中闭包与l...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作