Python基础——作用域,global与nonlocal

细碎知识,在此记录

  • 命名空间

命名空间:一个存放名字与值关系的空间,如a = 10

命名空间分类:
                               1.全局命名空间->我们直接在py文件中,函数外声明的变量都属于全局命名空间
                               2.局部命名空间->在函数中声明的变量会放在局部命名空间
                               3.内置命名空间->存放在python解释器为我们提供的名字,list,tuple,str,int等

加载顺序

                               1.内置命名空间
                               2.全局命名空间
                               3.局部命名空间(函数被执行的时候)

取值顺序:就近原则:局部->全局->内置

  • 作用域

全局作用域:内置+全局

局部作用域:局部

globals()  查看全局作用域的名字;返回的是一个字典(官方:以字典类型返回当前位置的全部全局变量。)

locals() 查看当前作用域的名字;返回的是一个字典(官方:以字典类型返回当前位置的全部局部变量。)

示例如下:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
def func():#在全局空间声明一个函数
    a = 10 #a为局部空间
    print(locals())#查看当前作用域,在这里为函数内部
func()#调用
print(globals())#查看全局
 
##结果: {'a': 10}
##      {略,'func':<xxxxxx>}

     

b = 10
print(locals())
print(globals())
#你会发现他们打印的东西是一样的,所以要理解当前作用域!!!
  •   global与nonlocal

个人理解:global:把全局变量拿到局部来用(变量能被改变);nonlocal:把离它最近的一层的变量拿到局部来用,但是不会拿全局变量(变量能被改变)

global代码:

#例1
a = 0
def func():
    return a  #因为局部没a,拿的是全局变量a
print(a)#a = 0
print(func())#a = 0
#例2
a = 0   #全局命名空间;声明全局变量
def func(): #声明函数,没有执行
    global a  #global关键字用来在函数或其他局部作用域中使用全局变量
    a +=1     #改变了全局变量a
    return a

print(a)#输出0,因为先执行打印a,而a没有变
print(func())#输出1,调用并且执行了函数,a的值已经变了

nonlocal代码:

# 例3
def func():#声明func()
    a = 0  #局部变量a
    def func2():
        nonlocal a  #调用上一层的,局部的a
        a +=1
        return a
    print("第一个函数里的a:%d" % a)#没有执行func2,a没有变
    print("func2函数的返回值a:%d" % func2())#执行func2
    print("最后a的值:%d" % a)#a已经变了
func()

#第一个函数里的a:0
#调用func2函数的返回值a:1
#最后a的值:1

 

欢迎交流,如有错误欢迎指正!

                    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值