在这篇文章中,将学习关于全局变量、本地变量和非本地变量关键字。
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