变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。变量分为:全局变量、局部变量。
全局变量:
在函数和类定义之外声明的变量。作用域为:定义的模块中,从定义位置开始直到模块结束;全局变量降低了函数的通用性和可读性,应尽量避免全局变量的使用;全局变量一般做常量使用;函数内要改变全局变量的值,需要使用 global 声明一下。局部变量:
在函数体中(包含形式参数)声明的变量;局部变量的引用比全局变量快,优先考虑使用;如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量。【案例1】理解局部变量不能在作用域外使用,及其内存变化 段1
a = 3 # 全局变量 def test01(b): print(b * 40)段2
print(a) print(b)执行结果: 内存分析: 段1代码执行后,形成了下图的内存状态 在执行段2的过程中,a能在栈中找到对应的内容,所以a有执行结果;b不能在栈中找到,它是没被定义的,所以会报错。 只有当调用test01这个函数时,假设现在操作
test(4)在执行过程中,内存状态会变化为 test01(4)运行结束,内存中b的所有内容就会自动消除,回到上一张图的内存状态,也就是说:b只在这个函数被调用时才存在与栈中。 【案例2.1】全局变量可以在函数内使用
a = 3 # 全局变量 def test02(b): print(b * 40) print(a * 30) test(4)运行结果: 【案例2.2】局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
a = 3 # 全局变量 def test03(b): print(b * 40) a = 5 print(a * 30) test03(4)运行结果:
【案例3.1】函数内要改变全局变量的值,需要使用 global 声明一下
a = 3 # 全局变量 def test04(b): print(b * 40) global a a = a * 3 test04(4) print(a)运行结果: 【案例3.2】函数内未用global 声明时,在函数内改变全局变量的值会报错
a = 3 # 全局变量 def test05(b): print(b * 40) a = a * 3 test05(4) print(a)运行结果:
【案例4】输出局部变量和全局变量
a = 100 def f1(a, b, c): print(a, b, c) print(locals()) # 打印局部变量 print('#' * 20) print(globals()) # 打印全局变量 f1(1, 2, 3)执行结果: 内容太长,截图不完整,执行的结果中的全局变量包含: 可以看到,全局变量包含a和定义的函数f1。