20201021

it2025-04-05  5

变量的作用域(全局变量和局部变量)

变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。变量分为:全局变量、局部变量。

全局变量:

在函数和类定义之外声明的变量。作用域为:定义的模块中,从定义位置开始直到模块结束;全局变量降低了函数的通用性和可读性,应尽量避免全局变量的使用;全局变量一般做常量使用;函数内要改变全局变量的值,需要使用 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。

最新回复(0)