函数作用域

在python中,函数名也是标识符,一个标识符的可见范围,就是标识符的作用域。一般常说的是变量的作用域。在python中没有常量,只有字面常量。

python中有全局作用域和局部作用域。
全局作用域:

  • 在整个程序运行环境中都可见

局部作用域:

  • 在函数内部可见
  • 局部变量的使用范围不能超过其所在的局部作用域

在嵌套函数中,外层变量作用域可在内层作用域可见;内层作用域中,如果定义了i=1,相当当前作用域重新定义了一个新的变量i,但是这个i并没有覆盖外层作用域中的i。

def counter():
    i = 0
    while True:
        i = 1
        i += 1
        yield i

全局变量(global):

  • 使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x。
  • 全局作用域中必须有x的定义,没有会报NameError。
x = 5
def foo():
    global x
    x += 1

下面这种写法是错误的:

x = 5
def foo():
    x += 1

函数内部x += 1其实是 x = x + 1,赋值即重新定义,相当于在foo内部定义一个局部变量x,那么foo内部所有的x都是这个局部变量x了,但是这个x还没有完成赋值,就被右边拿来做加1操作了。

global使用原则:

  • 外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离。
  • 如果函数需要使用外部全局变量,请使用函数的形参传参解决
  • 不用global

变量名解析原则:LEGB

  • Local,本地作用域、局部作用域的local命名空间。函数调用时创建,调用结束消亡。
  • Enclosing,python2.2时引入了嵌套函数,实现了闭包,这个就是嵌套函数的外部函数的命名空间。
  • Global,全局作用域,即一个模块的命名空间。模块import时创建,解释器退出时消亡。
  • Build-in,内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值