如何在Python中声明全局变量

时间:2020-01-09 10:38:45  来源:igfitidea点击:

在本教程中,我们将学习与在Python中声明变量(本地和全局)有关的不同术语。
我们需要熟悉namespacescopefunctions才能在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并在ifelse条件下进一步使用此值

#!/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的变量,它们将引用不同的事物。

  • 但是可能会碰壁:如果需要,我们可以通过各种方式访问其他命名空间中的名称。

  • 函数可以在两个不同的范围内访问变量:globallocal

  • 在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}