一、命名空间和作用域
1、内置命名空间——对应Python解释器
- Python解释器一启动就可以使用的名字存储在内置命名空间中,比如print、len、list、tuple、dict==
- 内置的名字在启动解释器的时候被加载进内存里
2、全局命名空间——对应 非函数的自定义代码
- 放置了我们设置的所有变量名和函数名(所有名字)
- 在程序从上到下被执行的过程中,一次加载进内存的
3、局部命名空间——对应 自定义函数
- 是函数内部定义的变量名和函数名
- 当调用函数的时候才会产生这个名称空间,随着函数执行的结束,该命名空间被回收
4、命名空间的其他内容
- 在局部,可以使用 当前局部、全局、内置命名空间中的名字。局部命名空间根据函数个数可能有多个,其之间是隔离的,不能相互调用
- 在全局,可以使用 全局、内置命名空间的名字,但是不能使用局部命名空间的名字
- 在内置,不可以使用 局部、全部命名空间的名字
- 以上符合 依赖倒置原则:上层模块应该依赖底层模块,底层模块不能依赖上层模块
- 在正常情况下使用内置的名字,会使用内置的函数或变量;在全局定义了和内置命名空间中 同名的名字时,会使用全局的函数或变量
- ——即,如果自己有就用自己的,如果自己没有就找底层的
print(max([1,2,3])) def max(): #重新定义了max的函数 print('in max func') max() #in max func----函数内存地址(),指的是内存调用 print(max()) #None print(max) #<function max at 0x101eb48c8>----函数名的值其实是 函数的内存地址
5、作用域
- 全局作用域:作用在全局,内置和全局名字空间中的名字都属于全部作用域
- 局部作用域:作用在局部,函数-局部名字空间中的名字属于局部作用域
- 对于不可变数据类型,在局部可以查看全局作用域中的变量,但是不能直接修改,如果想要修改,需要在程序的一开始添加global声明。如果在一个局部内声明了一个global变量,name这个变量在局部内的所有操作将对全局有效——不建议使用,不安全!!!使用形参、实参、返回值来修改
a = 1 def func(): #a += 2 #报错 a = 2 print(a) #重新定义了一个局部变量a = 2 func() print(a) #1,全局变量1没有改变
a = 1 def func(): global a a = 2 print(a) #2 func() print(a) #2
- 两个方法:globals、locals
a = 1 b = 2 def func(): x = 'aaa' y = 'bbb' print(locals()) #返回局部作用域中的所有名字及其值 print(globals()) #返回全局的名字 func()
二、三元运算符???视频丢失
def max(a,b): return a if a>b else b print(max(1,2))
三、函数的嵌套和作用域链
1、
四、闭包
1、