一、名称空间:(有3类)
(1)内置名称空间(全局作用域)
(2)全局名称空间(全局作用域)
(3)局部名称空间(局部作用域)
关于名称空间的查询:
x=1 def func(): print('from func') x=2 a=1 b=2 print(globals())#打印全局名称空间 print(locals())#打印局部名称空间 func()
执行结果是:
from func {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000026F9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x00000000028BB8C8>} {'b': 2, 'a': 1, 'x': 2}查询名称空间的全局变量:globals() 查询名称空间的局部变量:locals() 查询局部变量,只能在局部使用,在全局使用时,局部变量的查询结果和全局变量的查询结果一致 示例: x=1 def func(): print('from func') x=2 a=1 b=2 print(globals())#在局部打印全局 print(locals())#在局部打印局部 func() a=globals() print(a)#在全局打印全局 b=locals() print(b)#在全局打印局部 print(a == b)#判断在全局打印局部和全局的结果是否一致
执行结果是:(验证了:查询局部变量,只能在局部使用,在全局使用时,局部变量的查询结果和全局变量的查询结果一致)
from func {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>} {'b': 2, 'a': 1, 'x': 2} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>, 'a': {...}} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>, 'a': {...}, 'b': {...}} True
全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。 当全局变量与局部变量同名时: 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。 示例: x=1 #x=1为全局作用域 def foo(): x=20 #x=20为局部作用域 print(x) foo() #函数执行时,首先去局部找x的变量值,故打印结果为20 print(x)#输出的x是全局变量内的x,函数内的x与全局的x无关,故打印结果为1打印结果是:
20 1总结:
关于函数的作用域找名称的查询顺序是:
先去局部找,局部没有的话,再去全局查找,全局没有的话,再去内置找(先局部在全局最后内置)
二、函数的嵌套:(2个方面)
(1)、函数的嵌套调用:(函数内调用之前定义好的函数)
示例:
# 函数的调用: def my_max(x,y): res=x if x>y else y#比较x和y的大小,取较大值 return res def my_max4(a,b,c,d): res1=my_max(a,b)#调用上面的函数,将最大值取出 res2=my_max(res1,c)#调用上面的函数,将最大值取出后和c比较取最大值 res3=my_max(res2,d)#调用上面的函数,将最大值取出后和d比较取最大值 return res3 print(my_max4(1,2,3,4))执行结果是:
4(2)、函数的嵌套定义:(即函数内再定义函数)
示例:
def foo1(): x=1 print("foo1",x) def foo2(): x=2 print("foo2",x) def foo3(): x=3 print("foo3",x) foo3() foo2() foo1()执行结果是:
foo1 1 foo2 2 foo3 3
转载于:https://www.cnblogs.com/xuyuanyuan123/p/6684957.html
相关资源:实例详解python函数的对象、函数嵌套、名称空间和作用域