前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶|函数变量作用域

Python进阶|函数变量作用域

作者头像
罗罗攀
发布2019-10-08 15:49:24
6790
发布2019-10-08 15:49:24
举报
前言

在Python编程中,函数是我们接触较多的知识点,毕竟函数是用来节省代码量和提高程序效率很重要的一个手段。

首先,我们回顾下Python定义和使用函数的写法。

代码语言:javascript
复制
def sum(a,b):
    all = a + b
    return all

sum(1,2)

其中:

  • def是关键字,是函数的声明;
  • sum是函数名称,当然实际取名中,尽量取实际含义的名称,这样有利于代码的维护,也便于使用者的阅读;
  • 括号里的a和b是函数的参数;
  • 中间缩进的代码块就是函数的主体部分,是可执行的Python语句,用于实现一些功能,这里的功能就是求两个数之和;
  • 函数最后,可以返回结果(return和yield),也可以不返回;
  • 最后,使用函数名称,并传入相应的参数值,就可以调用函数了。
全局变量与局部变量

这两个名称解释起来还是很简单的,我们把函数外的变量叫做全局变量,而函数里面定义的变量则称为局部变量。

代码语言:javascript
复制
i = 1 #全局变量
def fun():
    j = 2 #局部变量

第一种情况: 函数里面使用全局变量,这个是没有问题的。

代码语言:javascript
复制
i = 1
def fun():
    print(i)

fun()
# 1

第二种情况: 在函数中修改全局变量,这种是会报UnboundLocalErro的错。原因是因为Python默认函数内部为局部变量,由于局部变量i没有声明,所以没法进行操作。

代码语言:javascript
复制
i = 1
def fun():
    i += 1
    print(i)

fun()
# UnboundLocalError: local variable 'i' referenced before assignment

这种情况下我们要使用global关键字,要进行声明i这个变量就是之前定义的全局变量i。

代码语言:javascript
复制
i = 1
def fun():
    global i
    i += 1
    print(i)

fun()
# 2

第三种情况: 局部变量和全局变量重名,我们来看看有什么有趣的事情会发生:

代码语言:javascript
复制
i = 1
def fun():
    i = 2
    print(i)

fun()
print(i)
#2
#1

有趣的事情发生了,从结果来看,当局部变量和全局变量重名,函数内部局部变量会将全局变量覆盖,而局部变量当函数调用完就被释放掉了,所以最后i的值还是全局变量i的值。

嵌套函数中的nonlocal

对于嵌套函数,内部函数要使用外部函数定义的变量,就需要用nonlocal这个关键字。

代码语言:javascript
复制
def outer():
    num = 10
    def inner():
        nonlocal num
        num = 100
        print('inner',num)
    inner()
    print('outer',num)

outer()
# inner 100
# outer 100
总结
  • 函数外的变量为全局变量,函数内的为局部变量,并且函数调用完局部变量会被释放;
  • global关键字用来在函数或其他局部作用域中使用全局变量; -nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 全局变量与局部变量
  • 嵌套函数中的nonlocal
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档