zoukankan      html  css  js  c++  java
  • python之global关键字的用法

    最近刚好有朋友遇到个global相关的问题,这里简单学习一下global关键字的用法。

    想要更好的了解global关键字,首先要熟悉python的全局变量与局部变量的概念。global关键字的作用是可以申明一个局部变量为全局变量,下面看一下实例

    一、变量作用域的说明

    这里简单提一下变量作用域的概念,有兴趣的小伙伴,可以查一下相关的博客

    1、局部变量

    def a():
        ## 菊部变量 - ,-
        local = 1
        print(local)
    ## 全局无法使用,只有自己可用
    print(lobal)

    2、全局变量

    global_str = '123'
    def a():
        ## 全菊变量 - ,-
        print(global_str)
    ## 全菊变量大家都可以用
    print(global_str)

    3、内置作用域

    系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。这里不介绍了。

    4、嵌套作用域

    用的也比较少,主要是用在闭包中,看栗子

    def out():
        ## 函数内变量,但对于下级函数就是全局变量,对于外部来说就是局部变量
        en = 1
        def inside():
            print(en)
            return en
        return inside()
    
    out()

    二、global关键字作用

    1、在函数间global关键字的作用

    def out():
        ## global关键字作用
        global en
        en = 1
        ## 调用other可以打印en,去掉global会报错。
        other()
        print(out.__globals__)
    def other():
        print(en)
    out()

    2、在类中也是一样,不多说,怕越多越乱,类中可以用self。

    3、其他文件导入,如果定义好了之后从其他文件导入了呢?会发生什么,看一下栗子,a文件仍为上面栗子中代码

    from report.a import *
    out()
    print(out.__globals__['en'])

    结果:

    1
    1

    还好还好,没有报错。

    4、那么问题来了,如果要在另一个文件中继续定义函数,是不是也可以继续使用a文件中的global申明的全局变量呢?

    from report.a import out
    
    def b():
        print(out.__globals__['en'])
        ## 直接飙红了。 -,-
        print(en)
    b()

    果然报错了:

    Traceback (most recent call last):
      File "/Users/dangfuli/Documents/PycharmProjects/asp/report/b.py", line 9, in <module>
        b()
      File "/Users/dangfuli/Documents/PycharmProjects/asp/report/b.py", line 6, in b
        print(out.__globals__['en'])
    KeyError: 'en'

    也就是说,导入包的话,global定义的全局变量没有被加到globals里面。

    5、上面好多地方都用到了,func.__globals__,这个运行一下,看个实例

    def out():
        ## global关键字作用
        global en
        en = 1
        other()
        print(out.__globals__)
        ## 调用other可以打印en
    
    def other():
        print(en)
    
    out()
    
    ## 返回结果
    1
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10306a7b8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/xxx/Documents/PycharmProjects/xxx/report/a.py', '__cached__': None, 'out': <function out at 0x101fcee18>, 'other': <function other at 0x1033f8c80>, 'en': 1}

    可以看到,当前的函数用global之后,en变量就被加到了globals里面

    下面看看导入到其他地方去的

    # a.py
    def out():
        ## global关键字作用
        global en
        en = 1
        other()
        print(out.__globals__['en'])
        ## 调用other可以打印en
    
    def other():
        print(en)
    
    #############上面是a文件,下面是b文件#############
    
    # b.py
    from report.a import out
    
    def b():
        ## globals里面没有en那个全局变量
        out()
        print(b.__globals__['en'])
    
    b()

    看一下结果:

    1
    1
    Traceback (most recent call last):
      File "/Users/xxx/Documents/PycharmProjects/xxx/report/b.py", line 8, in <module>
        b()
      File "/Users/xxx/Documents/PycharmProjects/xxx/report/b.py", line 6, in b
        print(b.__globals__['en'])
    KeyError: 'en'

    可以看到,导入的a文件正常运行,b文件打印en的时候就报错了。

    再看下面的例子:

    # a.py
    def out():
        ## global关键字作用
        global en
        en = 1
        # other()
        # print(out.__globals__['en'])
        ## 调用other可以打印en
    
    # def other():
    #     print(en)
    
    # b.py
    from a import *
    ##  b 文件没执行过a文件的out函数,也就是global还没定义
    # print('这个是out的:',out.__globals__['en'])    # KeyError: 'en'
    def b():
        ## 执行out,global被定义
        out()
        ## 打印out函数的globals
        print('这个是out的:',out.__globals__['en'])
        ## 打印b函数的globals
        # print('这个是b的:',b.__globals__['en'])    # KeyError: 'en'
    b()
    print('这里是分割线'.center(150,'-'))
    ## out函数执行过后,global已经被定义
    print('这个是out的:',out.__globals__['en'])
    # print(b.__globals__['en'])        # KeyError: 'en'

     可以得知,如果执行了对应函数,global定义的函数内会存入对应变量,其他函数内则不会存入

  • 相关阅读:
    如何制作挖空的填空题试卷?
    原型制图工具有哪些?
    书籍推荐?来几本吧
    离线部署ELK+kafka日志管理系统【转】
    Elasticsearch5.0 安装问题集锦【转】
    在Nginx服务器上屏蔽IP
    MySQL Warning: Using a password on the command line interface can be insecure.解决办法
    不老的神器:安全扫描器Nmap渗透使用指南【转】
    MySQL数据库设置为只读及测试【转】
    Linux中切换用户变成-bash4.1-$的解决方法
  • 原文地址:https://www.cnblogs.com/dflblog/p/11428631.html
Copyright © 2011-2022 走看看