科学网Day10 函数的命名空间和作用域
一、函数的命名空间
(一)内置命名空间
(二)全局命名空间
(三)局部命名空间
(一)内置命名空间
Python启动解释器后被加载在内存中,就可以使用的名字,如list、print、input、tuple等。
(二)全局命名空间
自己写的在自定义函数外的的变量名或函数名。程序自上而下执行,在执行的之后被加载进内存中
(三)局部命名空间
函数内部定义的名字,当函数调用时才会产生这个命名空间,随着函数执行的接数,这个命名空间也就消失了。
三者之间的关系:在局部,可以使用全局和内置命名空间;在全局可以使用内置命名空间,但不能使用局部命名空间,因为局部命名随着程序执行的结束而消失。这是依赖倒置的原则,上层模块可以依赖底层模块,底层模块不能依赖上层模块。
注意事项:
1、正常情况下,我们会使用内置命名空间的名字,当我们在全局定义了和内置命名空间的名字时,会使用全局的名字。即当自己有的时候不向上级要,你自己有权利做某件事时,不需要请示上级,若自己没有处理该项事务的权利,需要向上级请示。
2、func-->函数的名字指向函数的内存地址+(),函数名(),就是函数的调用,即函数的内存地址+()就是函数的调用。其本质是通过函数名找地址,通过地址调用函数(直接通过地址执行函数不好写,因此将函数名代替相应的地址)
3、一般情况下,多个函数应该拥有多个独立的局部名字命名空间,不能共享。
二、函数的作用域(一)全局作用域——作用在全局——内置和全局名字空间中的名字(包括函数和变量)都属于全局作用域,globals()可查看内置和全局作用域。
(二)局部作用域——作用在局部——函数(局部名字空间中的名字属于局部作用域)——locals()可查看局部作用域。
注意项:
1、对于不可变数据类型,在局部可参看全局作用域中的变量(如print()),但是不能修改,如果想要在函数中修改全局变量,需要在调用函数的一开始就添加global 声明
2、如果一个函数内,声明了一个global变量,那么这个变量在局部的所用操作将对全局的变量有效。
3、globals()永远打印全局的名字,locals()输出什么,根据locals()所在的位置
在自己写的程序中要尽量减少使用global声明全局变量,会更安全一些,可以通过接收参数和返回值来完成之前需要global才能完成的操作。
a=1 b=2 def func(): x='aaa' y='bbb' print(locals()) # 输出结果为:{'y': 'bbb', 'x': 'aaa'} print(globals()) # 输出结果:{'__builtins__': <module 'builtins' (built-in)>, 'a': 1, '__name__': '__main__', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000025A07EF7B00>, '__file__': 'C:/Users/17316/PycharmProjects/day2/pycharm.py', 'func': <function func at 0x0000025A07E09048>, '__cached__': None, '__package__': None, '__doc__': None, '__spec__': None, 'b': 2} func() print(globals()) # 输出结果为:{'__builtins__': <module 'builtins' (built-in)>, 'a': 1, '__name__': '__main__', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000025A07EF7B00>, '__file__': 'C:/Users/17316/PycharmProjects/day2/pycharm.py', 'func': <function func at 0x0000025A07E09048>, '__cached__': None, '__package__': None, '__doc__': None, '__spec__': None, 'b': 2} print(locals()) # 输出结果为:{'a': 1, '__file__': 'C:/Users/17316/PycharmProjects/day2/pycharm.py', '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__cached__': None, 'b': 2, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000025237117B00>, '__package__': None, '__spec__': None, 'func': <function func at 0x0000025237029048>}三、函数的嵌套和作用域链