Python局部函数及用法详解(含nonlocal关键字)

作者:梁辰兴 时间:2023-07-26 05:02:52 

Python局部函数及用法

通过前面的学习我们知道,Python 函数内部可以定义变量,这样就产生了局部变量,有读者可能会问,Python 函数内部能定义函数吗?答案是肯定的。Python 支持在函数内部定义函数,此类函数又称为局部函数。

那么,局部函数有哪些特征,在使用时需要注意什么呢?接下来就给读者详细介绍 Python 局部函数的用法。

首先,和局部变量一样,默认情况下局部函数只能在其所在函数的作用域内使用。举个例子:

#全局函数
def outdef ():
   #局部函数
   def indef():
       print("http://www.csdn.net/python/")
   #调用局部函数
   indef()
#调用全局函数
outdef()

程序执行结果为:

http://www.csdn.net/python/

就如同全局函数返回其局部变量,就可以扩大该变量的作用域一样,通过将局部函数作为所在函数的返回值,也可以扩大局部函数的使用范围。例如,修改上面程序为:

#全局函数
def outdef ():
   #局部函数
   def indef():
       print("调用局部函数")
   #调用局部函数
   return indef
#调用全局函数
new_indef = outdef()
调用全局函数中的局部函数
new_indef()

程序执行结果为:

调用局部函数

因此,对于局部函数的作用域,可以总结为:如果所在函数没有返回局部函数,则局部函数的可用范围仅限于所在函数内部;反之,如果所在函数将局部函数作为返回值,则局部函数的作用域就会扩大,既可以在所在函数内部使用,也可以在所在函数的作用域中使用。

以上面程序中的 outdef() 和 indef() 为例,如果 outdef() 不将 indef 作为返回值,则 indef() 只能在 outdef() 函数内部使用;反之,则 indef() 函数既可以在 outdef() 函数内部使用,也可以在 outdef() 函数的作用域,也就是全局范围内使用。

另外值得一提的是,如果局部函数中定义有和所在函数中变量同名的变量,也会发生“遮蔽”的问题。例如:

#全局函数
def outdef ():
   name = "所在函数中定义的 name 变量"
   #局部函数
   def indef():
       print(name)
       name = "局部函数中定义的 name 变量"
   indef()
#调用全局函数
outdef()

执行此程序,Python 解释器会报如下错误:

UnboundLocalError: local variable 'name' referenced before assignment

此错误直译过来的意思是“局部变量 name 还没定义就使用”。导致该错误的原因就在于,局部函数 indef() 中定义的 name 变量遮蔽了所在函数 outdef() 中定义的 name 变量。再加上,indef() 函数中 name 变量的定义位于 print() 输出语句之后,导致 print(name) 语句在执行时找不到定义的 name 变量,因此程序报错。

由于这里的 name 变量也是局部变量,因此前面章节讲解的 globals() 函数或者 globals 关键字,并不适用于解决此问题。这里可以使用 Python 提供的 nonlocal 关键字。

例如,修改上面程序为:

#全局函数
def outdef ():
   name = "所在函数中定义的 name 变量"
   #局部函数
   def indef():
       nonlocal name
       print(name)
       #修改name变量的值
       name = "局部函数中定义的 name 变量"
   indef()
#调用全局函数
outdef()

程序执行结果为:

所在函数中定义的 name 变量

来源:https://blog.csdn.net/m0_62617719/article/details/128380670

标签:Python,局部函数,nonlocal,关键字
0
投稿

猜你喜欢

  • IntelliJ IDEA卡死,如何优化内存

    2023-07-04 12:10:27
  • python调用文件时找不到相对路径的解决方案

    2021-08-21 14:38:24
  • MySQL删除数据Delete与Truncate语句使用比较

    2024-01-15 05:12:42
  • python实现移动木板小游戏

    2022-03-28 17:21:32
  • Django表单提交后实现获取相同name的不同value值

    2023-08-11 01:59:31
  • Go语言中rune方法使用详解

    2024-04-23 09:37:18
  • vue-cli 环境变量 process.env的使用及说明

    2024-05-29 22:28:45
  • Python基础教程之增加和去除数字的千位分隔符

    2021-12-04 13:46:12
  • sql2000数据库清除重复数据的二种方法

    2024-01-18 11:08:33
  • 在脚本中单独使用django的ORM模型详解

    2021-03-09 05:17:26
  • 如何让新页面在新窗口打开?

    2009-04-12 19:41:00
  • python3实现语音转文字(语音识别)和文字转语音(语音合成)

    2022-10-02 03:40:33
  • 在keras里面实现计算f1-score的代码

    2021-12-13 08:39:43
  • CentOS7.5 安装MySql的教程

    2024-01-13 07:08:16
  • asp如何随机显示网站链接?

    2010-06-07 20:40:00
  • Python3爬虫中关于Ajax分析方法的总结

    2021-04-07 17:28:47
  • Go http client 连接池不复用的问题

    2024-02-03 05:17:15
  • Python列表元素常见操作简单示例

    2022-08-18 08:33:57
  • Python版名片管理系统

    2021-08-28 18:51:22
  • SQLSERVER如何查看索引缺失及DMV使用介绍

    2024-01-21 12:08:59
  • asp之家 网络编程 m.aspxhome.com