如何在Python中声明全局变量
在本教程中,我们将学习与在Python中声明变量(本地和全局)有关的不同术语。
我们需要熟悉namespace
,scope
和functions
才能在python脚本中声明局部和/或者全局变量。
我们将详细介绍这些内容,我将尝试提供尽可能多的细节,甚至可以帮助初学者了解Python编程的基本概念。
我环境中的Python 版本
# python3 --version Python 3.6.8
用def定义一个函数
我们应该熟悉什么是函数以及如何在Python中定义函数。
在Python中,函数是代码组织和重用的主要且最重要的方法。
根据经验,如果我们希望多次重复相同或者非常相似的代码,则可能值得编写一个可重用的函数。
函数还可以通过给一组Python语句命名来帮助提高代码的可读性。
函数用
def
关键字声明,并用return
关键字返回:Python带有多个内置函数
在这个例子中,我们有一个简单的功能
# cat /tmp/define_functions.py #!/usr/bin/env python3 def do_nothing(): pass # Call the do_nothing function do_nothing()
即使对于一个没有这样参数的函数,我们仍然需要在其定义中加上括号()和冒号::。
下一行需要缩进,我们不能使用TAB,请使用空格字符来缩进下一行
Python要求pass语句显示此函数不执行任何操作。
我将执行此脚本
# python3 /tmp/define_functions.py
没有预期的"输出"。
现在我们将在屏幕上"打印"一些东西
#!/usr/bin/env python3 def hello_world(): print('hello world') # Call the hello_world function hello_world()
这个脚本的输出将执行print()
函数:
# python3 /tmp/define_functions.py hello world
我们将向前走一步,并使用函数返回布尔值True/False并在if
和else
条件下进一步使用此值
#!/usr/bin/env python3 def agree(): return True if agree(): print('Good, you agree') else: print('I hope you agree next time')
该脚本的输出:
# python3 /tmp/define_functions.py Good, you agree
所以,我现在希望,因为我们对Python中的函数有基本了解。
什么是Python中的命名空间和范围
Python程序具有多个"命名空间"部分,其中的特定名称是唯一的,并且与其他命名空间中的相同名称无关
每个"函数"定义了自己的名称空间。
如果我们在主程序中定义了一个名为x的变量,而在一个函数中定义了另一个名为x的变量,它们将引用不同的事物。
但是可能会碰壁:如果需要,我们可以通过各种方式访问其他命名空间中的名称。
函数可以在两个不同的范围内访问变量:
global
和local
。在Python中描述变量作用域的另一种更具描述性的名称是名称空间。
默认情况下,在"功能"内分配的所有变量都将分配给"本地"名称空间。
在接下来的章节和示例中,我们将更好地理解这一点。
声明局部变量
本地变量的标识符具有本地范围。
它的作用范围仅从其定义到功能块末尾。
当
function
返回给调用者时,它超出范围。因此,"局部"变量只能在定义它的"函数"内部使用。
让我们来看看这个简单的python脚本
#!/usr/bin/env python3 def func(): # declare local variable inside the function a = [] for i in range(5): a.append(i) func() print(a)
其中当函数" func()"被称为空列表时,将创建一个空列表a,添加五个元素,然后在"函数"退出时销毁a。
该脚本的输出将无法打印变量a的内容
# python3 /tmp/define_namespace.py Traceback (most recent call last): File "/tmp/define_namespace.py", line 9, in <module> print(a) NameError: name 'a' is not defined
声明全局变量
在任何"函数"(或者类)之外定义的标识符具有全局范围,这些标识符可能包括函数,变量和类。
具有全局作用域的变量称为"全局变量"。
具有全局范围的标识符在定义后即可在任何.py文件或者交互式会话中使用。
我们将使用现有示例,并在主脚本中将外部声明为全局变量
#!/usr/bin/env python3 # declare global variable outside the function a = [] def func(): for i in range(5): # Access global variable inside the function a.append(i) func() print(a)
该脚本的输出将打印变量a的内容,如全局范围内定义的那样(outside function
)。
# python3 /tmp/define_variable.py [0, 1, 2, 3, 4]
通过函数访问和修改全局变量
在最后一个示例中,我们"未修改"变量的值
默认情况下,我们不能在function中修改global变量,当我们首先向function块中的变量分配值时,python会创建一个新的局部变量。
对于此示例python脚本中的" example",我定义了一个" global"变量
接下来,我将在函数access_global()中访问此变量并输出值
然后我将在
modify_global_var()
函数中将var
的值从10修改为20。稍后我将调用
modify_global_var()
函数来检查var变量的值最后,我将再次打印
var
的值,以检查全局变量的内容是否被修改
在Python中声明和访问全局变量
现在,当我们执行脚本时,本地var
会覆盖modify_global_var()
中的全局var,从而使其在函数块的范围内不可访问。
但是我们的最后一个print
函数表明变量var
仍然存在,并且在执行函数modify_global_var()
之后具有其原始值(10
)。
# python3 /tmp/define_variable.py Value of var within function is: 10 New value of var after modification: 20 Original value of var is: 10
如果我们未在函数内使用global
,则Python使用本地名称空间,而变量为local
。
功能完成后,它消失了。
因此,"要在函数的块中修改全局变量",必须使用" global"语句来声明该变量是在全局范围内定义的:
修改全局变量值
我们将重新运行此python脚本:
# python3 /tmp/define_variable.py Value of var within function is: 10 New value of var after modification: 20 Original value of var is: 20
所以现在即使执行modify_global_var()
函数后,var的值仍然保留
Python提供了两个函数来"访问名称空间的内容":
locals()返回本地名称空间内容的字典。
globals()
返回一个全局名称空间内容的字典。
例如,我们在access_global()
函数中为var定义了一个新的局部变量,然后使用局部变量来打印可用的局部变量。
#!/usr/bin/env python3 # Define Global Variable var = 10 def access_global(): var=20 print('Value of var within function is: ', var) print('locals:', locals()) # Call access_global function access_global()
该脚本的输出
# python3 /tmp/define_variable.py Value of var within function is: 20 locals: {'var': 20}