我们通过几个例子来弄明白局域或全局变量,首先我们在函数内部和函数调用的代码中都使用同一个变量 a,将下方代码写入 /home/shiyanlou/local.py
:
#!/usr/bin/env python3 def change(): a = 90 print(a) a = 9 print("Before the function call ", a) print("inside change function", end=' ') change() print("After the function call ", a)
首先我们对 a
赋值 9,然后调用更改函数,这个函数里我们对 a
赋值 90,然后打印 a
的值。调用函数后我们再次打印 a
的值。
当我们在函数里写 a = 90
时,它实际上创建了一个新的名为 a
的局部变量,这个变量只在函数里可用,并且会在函数完成时销毁。所以即使这两个变量的名字都相同,但事实上他们并不是同一个变量。
那么如果我们先定义 a
,在函数中是否可以直接使用呢?
例如下面这段代码:
#!/usr/bin/env python3 a = 9 def change(): print(a) change()
这段代码是没有问题的,可以直接打印输出 9。稍微改动一下:
#!/usr/bin/env python3 a = 9 def change(): print(a) a = 100 change()
现在就会报错了:“UnboundLocalError: local variable 'a' referenced before assignment”,原因是当函数中只要用到了变量 a,并且 a 出现在表达式等于号的前面,就会被当作局部变量。当执行到 print(a)
的时候会报错,因为 a 作为函数局部变量是在 print(a)
之后才定义的。
现在我们使用 global
关键字,对函数中的 a
标志为全局变量,让函数内部使用全局变量的 a,那么整个程序中出现的 a
都将是这个:
#!/usr/bin/env python3 a = 9 def change(): global a print(a) a = 100 print("Before the function call ", a) print("inside change function", end=' ') change() print("After the function call ", a)
程序中的 end=' '
参数表示,print 打印后的结尾不用换行,而用空格。默认情况下 print 打印后会在结尾换行。
程序执行的结果,不会报错了,因为函数体内可以访问全局的变量 a
:
Before the function call 9 inside change function 9 After the function call 100
在函数内使用 global
会有什么作用呢?尝试下面的代码:
#!/usr/bin/env python3 def change(): global a a = 90 print(a) a = 9 print("Before the function call ", a) print("inside change function", end=' ') change() print("After the function call ", a)
程序执行的结果:
Before the function call 9 inside change function 90 After the function call 90
这里通过关键字 global
来告诉 a 的定义是全局的,因此在函数内部更改了 a
的值,函数外 a
的值也实际上更改了。
运行程序:
转自
Python3 简明教程 - 函数 - 实验楼
https://www.shiyanlou.com/courses/596/learning/?id=2043