6.5 局部变量和全局变量
6.5.1 局部变量
局部变量,就是在函数内部定义的变量,不同的函数,可以定义相同的名字的局部变量,各自的使用不会产生影响。
变量的使用范围就是它的作用域,局部变量的作用域仅限于定义它的这个函数内部。
6.5.2 全局变量
全局变量是在函数外部定义的变量。
全局变量的作用域从定义全局变量的语句开始直到py文件结束,包括其中的函数。
例如:6.10-作用域.py
# 作用域
# 第一句全局变量num
num = 100
def func():
print(num)
# 第一句函数调用
func()
# 第二句全局变量num
# num = 100
这时,num的作用域为第二行到结束,所以func的函数中可以使用num,输出结果为:
100
如果将第一句全局变量num注释掉,启用第二句全局变量num:
# 作用域
# 第一句全局变量num
# num = 100
def func():
print(num)
# 第一句函数调用
func()
# 第二句全局变量num
num = 100
func函数调用的位置在num作用域之外,所以结果为:
Traceback (most recent call last):
File "c:/Projects/kejian/python/code/ch06/6.10-作用域.py", line 11, in <module>
func()
File "c:/Projects/kejian/python/code/ch06/6.10-作用域.py", line 7, in func
print(num)
NameError: name 'num' is not defined
6.5.3 局部变量和全局变量的使用
当一个变量名在全局域中定义,在局部也有出现时,要遵守以下规则:
1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,而不管全局域中有没有该变量名。可以视为局部变量屏蔽了全局变量。例如:
# 全局变量num
num = 100
def func():
# 虽然有了全局变量num,但是在函数中,出现在=左边,则这个num为局部变量。
num = 123
# 之后的变量使用,则认为是使用了局部变量。
print(num)
func()
结果为:
123
2.函数内部的变量名如果第一次出现,且出现在=后面,且该变量在全局域中已定义,则这里将引用全局变量,如果该变量在全局域中没有定义,会出现“变量未定义”的错误。
# 全局变量num
num = 100
def func():
# num出现在=右边直接使用,则这时在使用全局变量num
x = num + 100
print(x)
func()
结果为:
200
只要是使用变量,而该变量在全局域中有定义,在局部没有定义,则会使用全局变量。
为了避免以上同名变量引发的全局变量和局部变量的区分,一般不建议全局变量和局部变量重名,避免程序难以读懂。
6.5.4 global语句
在函数内部默认只能引用全局变量,而不能对其修改,因为同名的变量名一旦出现在=左边,则是作为局部变量使用的。
如果想要在函数体内修改全局变量的值,就要使用global关键字。
例如:6.11-global语句.py
# 全局变量num
num = 100
def func():
# 使用global声明接下来的num是全局变量。
global num
# 对全局变量num赋值
num = 200
# 也可对全局变量num修改
num += 100
# 这里打印的也是全局变量num的值
print(num)
func()
print(num)
结果为:
300
300