服务热线: 66688888

bet36体育娱乐官网

科学网Day10 函数的命名空间和作用域

来源:开元棋牌 编辑:小三棋牌-【掌心诈金花】 时间:2020/02/27

一、函数的命名空间

(一)内置命名空间

(二)全局命名空间

(三)局部命名空间


(一)内置命名空间

Python启动解释器后被加载在内存中,就可以使用的名字,如list、print、input、tuple等。

(二)全局命名空间

自己写的在自定义函数外的的变量名或函数名。程序自上而下执行,在执行的之后被加载进内存中

(三)局部命名空间

函数内部定义的名字,当函数调用时才会产生这个命名空间,随着函数执行的接数,这个命名空间也就消失了。


三者之间的关系:在局部,可以使用全局和内置命名空间;在全局可以使用内置命名空间,但不能使用局部命名空间,因为局部命名随着程序执行的结束而消失。这是依赖倒置的原则,上层模块可以依赖底层模块,底层模块不能依赖上层模块。

注意事项:

1、正常情况下,我们会使用内置命名空间的名字,当我们在全局定义了和内置命名空间的名字时,会使用全局的名字。即当自己有的时候不向上级要,你自己有权利做某件事时,不需要请示上级,若自己没有处理该项事务的权利,需要向上级请示。

def input():     print('huang') input() # 输出结果为:huangdef max(l):     print('in max func') print(max([1,2,3])) 输出结果为: in max func Nonedef input():     print('in input now') def func():     input() func() # 输出结果为:in input nowdef input():     print('in input now') def func():     input = 1     # input()     print(input()) #程序优先从局部函数内读取input,在局部函数中得知input为整型,故报错。报错信息为:TypeError: 'int' object is not callable func()

2、func-->函数的名字指向函数的内存地址+(),函数名(),就是函数的调用,即函数的内存地址+()就是函数的调用。其本质是通过函数名找地址,通过地址调用函数(直接通过地址执行函数不好写,因此将函数名代替相应的地址)

def input():     print('in input now') def func():     print(input) func() #输出结果为:<function input at 0x0000025DCF159048> print(func) # 输出结果为函数的地址:<function func at 0x0000025DCF76AD90>

3、一般情况下,多个函数应该拥有多个独立的局部名字命名空间,不能共享。

二、函数的作用域

(一)全局作用域——作用在全局——内置和全局名字空间中的名字(包括函数和变量)都属于全局作用域,globals()可查看内置和全局作用域。

(二)局部作用域——作用在局部——函数(局部名字空间中的名字属于局部作用域)——locals()可查看局部作用域。

注意项:

1、对于不可变数据类型,在局部可参看全局作用域中的变量(如print()),但是不能修改,如果想要在函数中修改全局变量,需要在调用函数的一开始就添加global 声明

a = 1 def func():     a+=1 #报错a = 1 def func():     global a     a+=1  print(a) #未调用函数,执行结果为1a = 1 def func():     global a     a+=1 #报错 func() print(a) #调用函数了,执行结果为2

2、如果一个函数内,声明了一个global变量,那么这个变量在局部的所用操作将对全局的变量有效。

def func():     global a     a=2 func() print(a) #输出结果为:2

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>}三、函数的嵌套和作用域链


在线客服
在线客服
  • 售前咨询
  • 售后服务