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定義的函數內會存入對應變量,其他函數內則不會存入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM