Python之作用域解析

作用域:程序创建、访问、改变一个变量时,都是在一个保存该变量的空间内进行,这个空间为命名空间,即作用域。

  • python作用域是静态的,变量被赋值、创建的位置决定了其被访问的范围,即变量作用域由其所在位置决定。

    a = 1 #a为全局变量
    def local(): #local也在全局作用域中
        b = 2 #b为局部变量
    
  • 在Python中,使用一个变量时并不严格要求需要预先声明它,但是在真正使用它之前,它必须被绑定到某个内存对象(被定义、赋值);这种变量名的绑定将在当前作用域中引入新的变量,同时屏蔽外层作用域中的同名变量。

    a = 1
    def local():
        a = 2 #由于python不需要预先声明,因此在局部作用域中引入新的变量,而没有修改全局变量
    local()
    print(a)
    输出1
    
LEGB作用域
  • Local(局部):在函数与类中,每当调用函数时都会创建一个局部作用域,局部变量域像一个栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态;
    默认情况下局部是无法修改全局变量的:
    a = [1]
    def local():
       a = [1,2]
    local()
    print(a)
    输出[1]
    
    想要实现局部修改全局变量,有两种办法:
     #(1)增加global,nonlocal关键字
     a = [1]
    def local():
        a = [1,2]
    local()
    print(a)
    输出[1, 2]
    #(2)对于可变对象,如list,dict等,使用内置函数
    b = [1]
    def local():
        b.append(2)
    local()
    print(b)
    输出[1, 2]
    
  • Enclosed(嵌套):一般出现在函数中嵌套了一个函数,在外围的函数中的作用域;主要目的是实现闭包
    def local(i):
       a = [] #此处a在add函数的嵌套作用域内
       def add():
           a.append(i)
           return a
       return add
    temp = local(1)
    print(temp())
    输出[1]
    
  • Global(全局):模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性;仅限于单个模块文件中;
  • Built-in(内置):系统内解释器定义的变量,如预定义在builtin 模块内的变量;解释器在则在,解释器亡则亡;

使用规则: 从上往下顺序创建,从下往上搜索,即搜索遵循LEGB原则,如果一直搜索不到则报错。
在这里插入图片描述

金句
  • 无声明的情况下,赋值即私有,若外部有相同名称的变量则被遮挡
  • 想修改外部变量,需声明(global、nonlocal),或者通过可变对象的内置函数
  • python2中没有nonlocal关键字,只能用可变对象来临时解决中间层变量修改的问题

注意:Python与C有着很大的区别,在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。如下边语句在python中是不报错的,而在C++等中则报错。

>>>for i in range(3):
...    a = i
>>>print(a)
2

一个易错的例子:

  name = "lbj"
  def f1():
      print(name)
  def f2():
      name = "coldplay"
      f1()
  f2()
  输出lbj
  #在调用f1时,name在局部没有,会去搜索全局而f2的name只是局部的,与全局无关,因此输出lbj
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值