1,作用域
- 全局作用域:作用域编写的整个程序;
- 局部作用域:作用域函数内部范围;
- 不同的局部作用域是独立的,不同域的函数可以使用相同的参数名。
- 局部作用域可以引用上级的局部作用域的变量,但是不可以修改。
- 在局部作用域,如果用了本域没有的变量就会向上级查找。
- 各自作用域的内的变量随着各自域的释放而释放,即函数内的变量随着函数的调用产生,随着函数的结束释放。
2,默认参数陷阱
- 如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不赋值就公用这个数据类型的资源
def func(k = []): k.append(1) print(k) func() #>>>[1] func([]) #>>>[1] func() #>>>[1,1] func() #>>>[1,1,1]
3,函数名与内置函数名同名时
在正常情况下,直接使用内置函数的名字,调用内置函数但当我们在全局定义了和内置空间函数名相同时,会使用全局的名字
遵循原则,当自己有的时候就不在找上级要如果自己没有,就找上一级要,上级没有在再找上上级,如果内置空间都没有就报错
def input(): print('全局input') input() >>>全局input
4,函数名地址
def input(): print('全局input') def func(): print(input) #打印函数input()的地址 func() #>>><function input at 0x0000023EBD04D378>
- func指向一个地址,地址加()时一个函数的执行
- func————>函数的内存地址
- 函数名()————>函数的调用
- 函数的内存地址()————>函数的调用
5,函数调用全局变量
- 对于不可变数据类型 ,在局部可以查看全局作用域中的变量,但是不能直接修改
- 如果想要在局部作用域修改全局变量,需要在程序的一开始添加global声明
- 如果在一个局部(函数)作用域内声明了一个global变量,那么这个变量在局部的所有操作即是对全局变量的操作
a = 1 def func(): print(a) #局部可以查看全局变量 func() #>>>1
a = 1 def func2(): a += 1 #报错,局部不能更改全局变量
a = 1 def func3(): global a #声明变量a是全局变量a,修改即修改的全局变量a a += 1 func3() print(a) #>>>2
a=3 def func2(): a=0 #没有特殊声明,这是局部作用域func2函数范围的变量a a += 1 print(a) func2() #>>>1 print(a) #>>>3
6,查看局部变量,全局变量
- globals永远打印全局作用域的
- locals 意为:本地的,打印locals所在位置的作用域
a = 1 b = 2 def func(): x = '风' y = '雨' print(locals()) #查看局部变量 #>>>{'x': '风', 'y': '雨'} func() print(globals()) #查看全局变量 #输出的结果往后看 print(globals()) print(locals()) #此时打印的都一样,都是全局