一、参数补充
1 命名关键字参数(了解)
命名关键字参数:在定义函数时,*后定义的参数,如下所示,称之为命名关键字参数
特点1:命名关键字实参必须按照key=value的形式为其传值
def func(x,y,*,a,b):
print(x,y,a,b)
func(1,2,b=123,a=321)
#a和b必须用关键字实参传值不然报错
多形式混用:
#形参混用的顺序:位置新参,默认形参,*args,命名关键字形参,**kwargs
def func(x,y=111,*args,z,**kwargs):
print(x)
print(y)
print(args)
print(z)
print(kwargs)
func(1,2,3,4,z=13,a=123,b=123)
>>>1
>>>2
>>>(3, 4)
>>>13
>>>{'a': 123, 'b': 123}
二、名称空间
名称空间是指存放名字和对象的映射关系/绑定关系的地方,例如x=3,在内存中的栈区里开辟了一个空间来存放x和x与10的绑定关系,这个空间就是名称空间。
1.内置名称空间
存放的名字:存放的python解释器内置的名字
存活周期:python解释器启动则产生,python解释器关闭则销毁
'''
>>> print
<built-in function print>
>>> input
<built-in function input>
'''
2.全局名称空间
存放的名字:只要不是函数内定义,也不是内置的,就是全局名称
存活周期:python文件执行则产生,关闭则销毁
import os #os为全局名称
x=10 #x是全局名称
if True:
y=10#y是全局名称
def func():#func是全局名称
pass
class Foo:#Foo是全局名称
pass
3.局部名称空间
存放的名字:在函数调用时,运行函数体代码的过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后则销毁
def func(x,y):
z=10
func(1,2)
4.名称空间的加载与销毁顺序
加载顺序
内置名称空间>全局名称空间>局部名称空间
销毁顺序
局部名称空间>全局名称空间>内置名称空间
名字的查找顺序
由当前位置向上一层查找
由内到外依次是局部名称空间>全局名称空间>内置名称空间
通过示范来解释名称空间的嵌套使用
注意:名称空间的嵌套关系是以函数定义阶段为准,和调用位置无关
实例1:
x=1
def func(): #第五步:执行func函数体代码
print(x) #输出x,在该名称空间找不到x,搜索全局名称空间查找到x=1
def foo(): #第二步:执行foo函数体代码
x=222 #第三步:执行第一行,定义局部变量x=10
func() #第四步:调用func函数,foo函数到此结束,销毁内部的局部变量,即x=10
foo() #第一步:调用foo函数
>>>1 #第六步:执行代码得到1
实例2:
x=10
#此处报错是因为在函数定义阶段违反了变量先定义后引用的规则
def foo():
print(x)
x=20
foo()
>>>报错
三、作用域
即名称空间的作用范围
全局作用域:内置名称空间,全局名称空间
1.全局存活
2.全局有效,被所有函数共享
x=111
def foo():
print(x,id(x))
def bar():
print(x,id(x))
foo()
bar()
>>>111 140717457109072
>>>111 140717457109072
>>>111 140717457109072
局部作用域:局部名称空间
1.临时存活
2.局部有效,函数内有效
def foo(x):
def f1():
def f2():
print(x)
f2()
f1()
foo(1)
示范1:(global)如果想在局部里修改全局对应的变量值(不可变类型),就需要用到global
x=111
def func():
global x # 声明x这个名字是全局的名字,不要再造新的名字了
x=222
func()
print(x)
示范2:(nonlocal)修改函数外层函数包含的不可变类型
x=0
def f1():
x=11
def f2():
nonlocal x#让接下来的x=22作用在外层函数
x=22
f2()
print('f1内的x:',x)
f1()
print(x)
>>>f1内的x: 22
>>>0