文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python全局空间和局部空间是什么

2023-06-29 21:20

关注

这篇“Python全局空间和局部空间是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python全局空间和局部空间是什么”文章吧。

一、空间和局部空间

1、命名空间

命名空间的概念的提出是为了划分和控制变量是否可见,以及生存周期的长短;命名空间的作用范围叫做作用域。
划分一块区域保存所有数据,以字典的方式存储(变量与值形成映射关系)。一共三种。

内建命名空间:
解释器启动时创建,直到解释器运行结束,生存周期最长;
全局命名空间:
文件运行时创建,直到解释器运行结束,生存周期较长;
局部命名空间:
数调用时,里面的局部变量才创建,调用结束后即释放,生存周期较短;
创建和销毁顺序
创建顺序:
python解释器启动->创建内建命名空间->创建全局命名空间->创建局部命名空间
销毁顺序:
函数调用结束后->销毁函数对应的局部命名空间数据->销毁全局命名空间数据->销毁内建命名空间数据

2、全局变量和局部变量

什么是全局和局部变量:

局部变量就是在函数内部定义的变量,局部变量所在的就是局部命名空间,作用域仅仅在函数内部可见,也就是说只能在函数内部使用。

# 在函数中创建的变量就是局部变量def func():   var = '局部变量'# 局部变量不可以在非对应局部环境中使用print(var)  # error, 该变量不存在

全局变量就是在函数外部定义的或者使用global在函数内部定义的变量,全局变量所在的命名空间就是全局命名空间,作用域横跨整个文件,就是说在整个文件中的任何一个地方都可以使用全局变量。

# 在全局环境中创建的变量就是全局变量var = '全局变量'def func():    # 在局部中也可以使用全局变量    print(var)  # 全局变量func()

局部变量最好不要和全局变量同名,如果同名,在局部环境中就无法使用全局变量了。

var = '全局变量'def func():    # 先使用了全局变量    print(var)  # error, 找不到该变量        # 然后局部变量和全局变量同名,那么新的局部变量就会在局部空间中覆盖了全局变量的一切影响力,这就叫做局部变量修改了全局变量;    # 这样的话导致在局部空间中无法在使用该全局变量,之前在局部空间中使用的该变量就成为了先调用后定义;导致出错。    var = '局部变量'    print(var)func()# 但是局部同名变量不会影响到全局变量的值print(var)  # 全局变量

内置函数就是内建命名空间,指的是那些python中自带的、内置的函数。

3、作用域

局部变量作用域:在函数的内部
全局变量作用域:横跨整个文件

4、生命周期

内置变量 -> 全局变量 -> 局部变量
内置变量自python程序运行的时候开始,一直等到python程序结束之后才会释放;
全局变量自创建开始,一直到程序结束或者被清除才会释放;
局部变量字创建开始,一直到局部空间执行结束或者清除就会释放;

5、全局部函数和关键字的使用

函数

Python全局空间和局部空间是什么

globals()

返回所有的全局作用域中的内容。
如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;

# 定义一些全局变量a, b, c = 1, 2, 3# 调用globals函数res = globals()# 第一次打印,包含a b cprint(res)'''结果:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002DBDCA5D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}}'''# 再定义一些变量d, e, f = 1, 2, 3# 第二次打印,包含a b c d e fprint(res)'''结果:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002DBDCA5D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}, 'd': 1, 'e': 2, 'f': 3}'''

如果在局部,调用globals之后,获取的是调用之前的所用变量,返回字典,全局空间作用域;

# 定义一些全局变量a, b, c = 1, 2, 3# 在局部环境中使用globals函数def func():    res = globals()    print(res)# 调用函数func()'''结果:不包含 d e f{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E7C287D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'func': <function func at 0x000001E7C2772F28>}'''# 再定义一些全局变量d, e, f = 4, 5, 6# 第二次调用函数func()'''结果:包含 d e f{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000021A3F3DD198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'func': <function func at 0x0000021A3F2D2F28>, 'd': 4, 'e': 5, 'f': 6}'''

globals可以动态创建全局变量

dic = globals()print(dic)  # 返回系统的字典'''结果:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000026F357ED198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'dic': {...}}'''# 在全局的字典当中,通过添加键值对,自动创建全局变量,对应的键是变量名,对应的值是变量指向的值dic['msr123123123'] = '123456'print(msr123123123) # 123456# 查看全局内容print(dic)'''结果:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000161D944D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'dic': {...}, 'msr123123123': '123456'}'''

locals()

返回当前所在作用域的所有内容。
如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;

# 定义一些全局变量a, b, c = 1, 2, 3# 调用locals函数res = locals()# 第一次打印,包含a b cprint(res)'''结果:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018C82A3D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test1.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}}'''# 再定义一些变量d, e, f = 1, 2, 3# 第二次打印,包含a b c d e fprint(res)'''结果:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018C82A3D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test1.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'res': {...}, 'd': 1, 'e': 2, 'f': 3}'''

如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域;

# 定义一些局部变量def func():   # 局部变量   aa, bb, cc = 11, 22, 33   # 第一遍调用   res = locals()   # 第一次打印,包含 aa bb cc   print(res)  # {'cc': 33, 'bb': 22, 'aa': 11}   # 再定义一些局部变量   dd, ee, ff = 44, 55, 66   # 第二次打印,不包含 dd ee ff   print(res)  # {'cc': 33, 'bb': 22, 'aa': 11}   # 调用第二遍   res2 = locals()   # 打印第一次的调用,包含 dd ee ff   print(res)  # {'cc': 33, 'bb': 22, 'aa': 11, 'ff': 66, 'ee': 55, 'dd': 44, 'res': {...}}      # 打印第二次的调用,包含 dd ee ff   print(res2) # {'cc': 33, 'bb': 22, 'aa': 11, 'ff': 66, 'ee': 55, 'dd': 44, 'res': {...}}# 调用函数,返回在函数中的局部变量func()

关键字

Python全局空间和局部空间是什么

global

在局部环境中创建的变量是局部变量,在全局环境中是不可以使用的。但是使用global定义的变量就是一个全局变量,这个变量可以全局环境中使用。

def func():    var = '局部变量'    global glvar    glvar = '全局变量'# 一定要执行局部环境哟func()# 全局环境中print(var)  # error,局部变量不能调用# 使用global定义的变量是全局变量print(glvar)    # 全局变量

在局部环境中无法修改全局变量的值,使用global可以在局部环境中修改全局变量。

var = '全局变量'def func():    global var    var = '局部环境中修改'func()print(var)  # 局部环境中修改

6、函数的嵌套

在学习nonlocal之前我们需要先学习一些关于函数嵌套的知识。

内函数和外函数

函数之间是可以互相嵌套的,外层的叫做外函数,内层的叫做内函数。

def outer():    print('我叫outer,是外函数')    def inner():        print('我叫inner,在outer的里面,是内函数')    # 在外函数中执行内函数    inner()# 执行外函数outer()'''结果:我叫outer,是外函数我叫inner,在outer的里面,是内函数'''
# 外层是outer,内层是inner,最里层是smaller,调用smaller里的所有代码def outer():    print('我叫outer,是最外层函数,是inner和smaller的外函数')    def inner():        print('我叫inner,是outer的内函数,是smaller的外函数')        def smaller():            print('我叫smaller,是outer和inner的内函数')        # 先在inner中执行smaller        smaller()    # 然后在outer中执行inner    inner()# 最后再执行outer才能执行smaller函数outer()'''结果:我叫outer,是最外层函数,是inner和smaller的外函数我叫inner,是outer的内函数,是smaller的外函数我叫smaller,是outer和inner的内函数'''

我们在多个函数嵌套的时候要注意,不管外函数还是内函数,都是函数,只要是函数中的变量都是局部变量。
内涵可以使用外函数的局部变量,外函数不能直接使用内函数的局部变量。

二、LEGB原则

LEGB原则就是一个就近找变量原则,依据就近原则,从下往上,从里向外,依次寻找。

B&mdash;&mdash;&mdash;&mdash;Builtin(Python):Python内置模块的命名空间    (内建作用域)
G&mdash;&mdash;&mdash;&mdash;Global(module):函数外部所在的命名空间        (全局作用域)
E&mdash;&mdash;&mdash;&mdash;Enclosing Function Locals:外部嵌套函数的作用域(嵌套作用域)
L&mdash;&mdash;&mdash;&mdash;Local(Function):当前函数内的作用域           (局部作用域)

Python全局空间和局部空间是什么

nonlocal

现在我们正式学习nonlocal关键字,nonlocal的作用是修改当前局部环境中上一层的局部变量。那么我们根据这个作用便知道了nonlocal的使用环境至少是一个二级的嵌套环境,且外层的局部环境中必须存在一个局部变量。

def outer():    # 定义变量    lvar = 'outer var'    def inner():        # 内函数使用nonlocal修改上一层的局部变量        nonlocal lvar        lvar = 'inner var'    # 执行inner函数    inner()    print(lvar)outer() # inner var

假如上一层的局部环境中没有这个变量怎么办,那么就根据LEGB原则向上寻找。

def outer():    # 定义变量    lvar = 'outer var'    def inner():                def smaller():                        # smaller中修改变量,但是inner中没有,就向上寻找修改outer中的变量            nonlocal lvar            lvar = 'smaller var'        # 执行 smaller函数        smaller()    # 执行inner函数    inner()    print(lvar)# 执行outer函数outer()

如果层层寻找,直到最外层的函数中也没有这个变量,那么就会报错,因为nonlocal只会修改局部变量,如果超出范围,就会报错。

var = 1  # 变量在最外层的函数之外,也就是全局变量,nonlocal无法修改def outer():   def inner():      def smaller():         nonlocal var    # error,没有局部变量         var = 2         print(var)      smaller()   inner()outer()

三、总结

全局变量和局部变量

局部环境中可以调用全局变量,但是不能修改(但是如果全局变量是可变数据则可以修改其中的值)
全局环境中不能调用局部变量 也不能修改

函数
global()
(在函数内部使用,可以对全局变量进行操作)

nonlocal()
(在内函数中使用,可以在内函数中修改外函数中的局部变量)

关键字:

locals
1、locals获取当前作用域当中所有的变量
如果在全局调用locals之后,获取的是打印之前的所有变量,返回字典,全局作用域
如果在局部调用loclas之后,获取的是调用之前的所有变量,返回字典,局部作用域

globals
2、globals只获取全局空间中的所有变量
如果在全局调用globals之后,获取的是打印之前的所用变量,返回字典,全局作用域
如果在局部调用globals之后,获取的是调用之前的所用变量,返回字典,全局作用域

以上就是关于“Python全局空间和局部空间是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯