Python Global Keyword

在这篇文章中,将学习关于全局变量、本地变量和非本地变量关键字。

global关键字简介:

 在Python中,global关键字允许你在当前作用域之外修改变量。它经常被用于创建全局变量并在本地上下文中修改该变量。

global关键字规则:

在Python中,global关键字的基本规则如下

  • 当我们在一个函数中创建一个变量,默认情况下它是本地变量
  • 当我们在函数之外创建一个变量,默认情况下它是全局变量。不必使用global关键字进行声明
  • 我们在一个函数中,使用global关键字读或写一个全局变量
  • 在函数之外使用global关键字是无效的

使用global关键字(含例子)

案例1:从函数内部访问全局变量

c = 1 #声明一个全局变量

def add():
    print(c);

add();

执行结果是1。这是我们从一个函数内部访问全局变量。

但我们在一些场景下可能要在函数中修改全局变量。

案例2:在函数内部修改全局变量

c = 1 #定义一个全局变量

def add():
    c = c + 1; #修改全局变量的值
    print(c);

add(); #执行add()函数

执行结果是:UnboundLocalError: local variable 'c' referenced before assignment

这是因为在函数中,我们只能访问全局变量,但是在函数中不能修改其值。

该问题的解决方案就是使用 global关键字。

案例3:在函数内部使用global关键字修改全局变量的值

c = 1 #全局变量

def add():
    global c
    c = c + 2
    print("Inside add():",c)

add()

print("In main():",c)

执行结果是:

Inside add(): 3

In main(): 3

在上面这段代码中,我们在add()函数内部定义了"c",将其作为全局关键字。

然后,我们给变量c增加2,即c = c + 2。之后,我们调用了add()函数。最后我们打印全局变量c。

如我们看到的,函数外的全局变量也发生变化了,c=3。

Python模块中的全局变量

在Python中,我们创建一个单独的模块"config.py"来保存一些全局变量,并且在同一个项目中的Python模块之间共享信息。

下面我们展示下如何在Python模块之间共享全局变量。

案例4:在Python模块之间共享全局变量

创建config.py来存储全局变量

#config.py
a = 0
b = "empty"

创建update.py来修改全局变量

#update.py
import config

config.a=10
config.b="alphabet"

创建main.py,来测试值的变化

#main.py

import config
import update

print(config.a)
print(config.b)

运行main.py,结果是 10 alphabet

在上面的函数中,我们创建了3个文件:config.py,update.py,main.py

模块config.py存储全局变量 a 和 b。在update.py中,我们导入了config.py模块并改变了 a 和 b的值。

同样,我们在main.py中导入了config.py和update.py模块。最后,我们打印并测试全局变量的值,看看它到底变没变。

嵌套函数中的全局变量

下面介绍如何在嵌套函数中使用全局变量

def foo():
    x = 20

    def bar():
        global x
        x = 25
    
    print("Before calling bar: ", x)
    print("Calling bar now")
    bar()
    print("After calling bar: ", x)

foo()
print("x in main : ", x)

执行结果是:

Before calling bar: 20
Calling bar now
After calling bar: 20
x in main : 25

在上面代码中,我们在嵌套的函数bar()中定义了global变量。在foo()函数中,变量x 没有全局关键字的效力(参考上面的案例3)。

在调用bar()之前和之后,变量x 为本地变量,即x=20。在foo()函数之外,变量x 会去bar()函数中的值,即x =25。

这是因为在bar()函数中,我们使用global关键字声明了一个全局变量x(本地范围)。

如果我们在bar()函数中做任何修改,则这些修改会出现在本地范围之外,即foo()函数之外。

为方便理解"嵌套函数中的全局变量",做两个例子

案例1:

def foo():
    x = 20

    def bar():
        global y
        y = 25
    
    print("Before calling bar: ", x)
    print("Calling bar now")
    bar()
    print("After calling bar: ", x)

foo()
print("y in main : ", y)

执行结果:

Before calling bar: 20
Calling bar now
After calling bar: 20
y in main : 25

案例2:

def foo():
    x = 20

    def bar():
        global y
        x = 125  #验证x=20的作用范围
    
    print("Before calling bar: ", x)
    print("Calling bar now")
    bar()
    print("After calling bar: ", x) #调用之后,x也是20

foo()
print("y in main : ", y)  #此时会报错:NameError:global name 'y' is not defined

via: https://www.programiz.com/python-programming/global-keyword

作者:programiz 

发布了57 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shafatutu/article/details/103603608