命名空间:
当程序运行时,代码从上至下依次执行,它会将变量和值的关系存储在一个空间中
这个空间叫做名称空间,也叫做命名空间,全局名称空间
当程序遇到函数时,它会将函数名存储在内存中,函数体漠不关心
当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码
函数访问不到临时空间的内容,随着函数的执行完毕,临时空间释放
临时开辟的空间叫做临时名称空间,也叫做局部名称空间
python中名称空间分三种:
内置名称空间
全局名称空间
局部名称空间
作用域
全局作用域:
内置名称空间
全局名称空间
局部作用域:
局部名称空间
加载顺序:
1、内置名称空间
2、全局名称空间(当程序执行时)
3、局部名称空间(当函数调用时)
取值顺序:
1、局部名称空间
2、全局名称空间
3、内置名称空间
从小到大,单向不可逆的寻找
函数嵌套:
函数内调用函数
内置函数globals() locals()
globals()
返回一个字典,字典里面的内容是全局名称空间的内容
locals()
返回一个字典,当前位置的所有变量
关键字global nonlocal
局部空间只能引用全局变量,不能改变
global
1、引用并改变全局变量
2、声明全局变量,声明后可修改
nonlocal
1、不能操作全局变量
2、声明非当前临时空间变量,并依次向上查找变量,声明后可修改
函数名的应用:
1、可以被引用
2、作为容器类数据的元素
3、作为函数的参数
4、作为函数的返回值
5、如变量,可以任意赋值
像这样的函数名,有一个叫法:第一类对象
闭包:
内层函数对外层函数非全局变量引用
用函数名.__closure__ 判断是否为闭包
装饰器初识
含义;本质是闭包
根本作用;在不影响原函数执行的基础上,增加一些额外的功能登陆打印等
def log(func):
"""
保存日志装饰器
:param func: 函数对象
:return: 新函数对象
"""""
def inner():
if status_dict['login']:
user = status_dict['login']
else:
user = 'guest'
with open(file='blog.log', encoding='utf-8', mode='a') as log_file:
log_file.write('[%s] %s用户访问%s\n'
% (time.strftime('%Y-%m-%d'), user, choice_list[choice.strip()]))
func()
return inner
如果默认参数是一个可变的数据类型,那么它在内存中,永远是一个
def extendList(val, list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123, [])
list3 = extendList('a')
print('list1=%s' % list1)
print('list2=%s' % list2)
print('list3=%s' % list3)
'''
[10, 'a']
[123]
[10, 'a']
'''
转载于:https://blog.51cto.com/wlmint/2122657