变量的作用域(全局变量和局部变量)
变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。变量分为:全
局变量、局部变量。
全局变量:
- 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块
结束。 - 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
- 全局变量一般做常量使用。
- 函数内要改变全局变量的值,使用 global 声明一下
局部变量:
- 在函数体中(包含形式参数)声明的变量。
- 局部变量的引用比全局变量快,优先考虑使用。
- 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
代码:全局变量的作用域测试
a = 100 #全局变量
def f1():
global a #如果要在函数内改变全局变量的值,增加 global 关键字声明
print(a) #打印全局变量 a 的值
a = 300
f1()
print(a)
执行结果:
100
300
代码:全局变量和局部变量同名测试
a=100
def f1():
a=3 #同名的局部变量
print(a)
f1()
print(a)
#a 仍然是 100,没有变化
执行结果:
3
100
代码:输出局部变量和全局变量
a = 100
def f1(a,b,c):
print(a,b,c)
print(locals())
print("#"*20)
print(globals())
f1(2,3,4)
执行结果:
234
{'c': 4, 'b': 3, 'a': 2}
####################
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class
'_frozen_importlib.BuiltinImporter'>,
'__spec__':
None,
'__annotations__':
{},
'__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:\\PythonExec\\if_test01.py',
'a': 100, 'f1': <function f1 at 0x0000000002BB8620>}
局部变量和全局变量效率测试
局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。
在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度。
代码:测试局部变量和全局变量效率
#测试局部变量、全局变量的效率
import math
import time
def test01():
start = time.time()
for i in range(10000000):
math.sqrt(30)
end = time.time()
print("耗时{0}".format((end-start)))
def test02():
b = math.sqrt
start = time.time()
for i in range(10000000):
b(30)
end = time.time()
print("耗时{0}".format((end-start)))
test01()
test02()
运行结果:
耗时 2.3589999675750732
耗时 1.6410000324249268
多次运行结果对比: