1. 函数底层剖析![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e00ddf10ecc128a4b0a7ea5388a4ba12.png#pic_center)
定义到时候,def会在堆中创建一个函数对象,包含了函数的参数和代码信息
然后在栈中也会生成一个变量(函数名),变量中保持的时堆中函数对象的地址
上面这两步时函数定义时发生的事
函数调用时,变量名+小括号(eg:test01())会通过变量名执行堆中对象的代码,堆中创建一次,可执行多次
当每一个函数被调用,会在栈中创建一个所谓的栈帧,栈帧中存放函数中的局部变量(函数执行完,栈帧销毁,再次调用再创建栈帧)
局部变量的 查询和访问速度 比全局变量快,特别强调效率的地方和循环次数较多的地方,可通过将全局变量转为局部变量,提高运行速度
2. 参数的传递_传递可变对象与不可变对象
函数参数的传递本质上就是:实参到形参到赋值操作。
所有的赋值操作都是 "引用的赋值“,而 不是值传递
- 对“可变对象”进行“写操作”,直接 作用于原对象本身
- “不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的📄填充这块空间
传递不可变对象的引用
n的地址改变(id),说明产生了新的对象
不可变对象包含可变子对象时。 改变可变对象,则源对象也会发生改变
3.递归函数调用内存分析_栈帧的创建
在栈中反复开辟栈帧,直到栈overflow了(无终止条件时)
压栈。先进后出
有终止条件的递归