【Python】函数中修改全局变量,是否需要使用global进行申明

前言

Python中,全局变量与局部变量的使用往往令新手头疼,特别是在多任务场景下,我们需要借助多线程、多进程、协程等方式进行代码的编写,其中全局变量的使用必不可少。
本节将说明Python函数中修改全局变量,何时需要使用global进行申明

示例1:对全局变量进行赋值操作

num = 0         # num的初始值为0


def test1():
    print(num)  # 证明全局变量num可以正常访问


def test2():
    global num
    print(num)
    num += 1    # 使用global申明之后,可以访问并修改全局变量num


def test3():
    print(num)  # 不使用global申明,对全局变量num进行赋值操作将导致num无法正常访问
    num = num + 1


test1()
test2()
print(num)
test3()

运行结果:

0
0
1
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-10-b89ecb3b1c92> in <module>
     20 test2()
     21 print(num)
---> 22 test3()

<ipython-input-10-b89ecb3b1c92> in test3()
     13 
     14 def test3():
---> 15     print(num)  # 不使用global申明,对全局变量num进行赋值操作将导致num无法正常访问
     16     num = num + 1
     17 

UnboundLocalError: local variable 'num' referenced before assignment

分析

  • 第一行输出0,说明不申明全局变量,num可以正常访问
  • 第二行输出0,说明申明全局变量,num可以正常访问
  • 第三行输出1,说明test2()对于全局变量num的修改成功
  • 调用test3(),运行print(num)报错:“UnboundLocalError: local variable ‘num’ referenced before assignment”,说明,赋值语句的加入让解释器认为函数中新建了一个局部变量num,但这个num并未初始化,所以报错。

由此可见,对全局变量进行赋值一类的操作,必须使用global进行申明,若只是访问但不修改,则可不申明。

示例2:对全局变量作插入操作

nums = [1, 2]# 初始值为100

def test1():
	global nums  # 申明全局变量
	nums += [3]

def test2():
	nums.append(4)  # 不申明全局变量

print(nums)
test1()
print(nums)
test2()
print(nums)

运行结果:

[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

分析

  • 第二行输出[1, 2, 3],说明test1()对于全局变量nums的修改成功
  • 第三行输出[1, 2, 3, 4],说明test2()对于全局变量nums的修改成功,因为append操作只是在原来的全局变量nums中新增元素,并不会让解释器认为nums是新建的局部变量。

由此可见,对全局变量进行插入一类的操作,只要不更改全局变量的指向,不使用global进行申明也允许。

结论:

在一个函数中,对全局变量进行修改的时候,到底是否需要使用global进行申明,要看是否对全局变量的指向进行了修改。

  • 如果修改了指向,即让全局变量指向到一个新的地方,那么必须使用global;
  • 如果仅仅只是修改了指向的空间中的数据,则可不必。
原创文章 36 获赞 32 访问量 2751

猜你喜欢

转载自blog.csdn.net/weixin_43868754/article/details/105210628