show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次了解到函数参数的一些细节
- 全局变量和函数局部变量同名时
- 在函数内部
- 局部变量会屏蔽(shadow)全局变量
- 如果想要在函数内部访问重名全局变量
- 可以把同名局部变量声明为global
- 函数内部声明global的局部变量
- 不会在函数结束时消失
- 而是会作为全局变量存在
- 函数内部没有声明global的局部变量
- 在主程序部分不可见
- 主程序也有变量
- 子函数也有变量
- 应该如何理解呢?🤔
- 运行结果
- fun是一个函数(function)类的对象
- 地址在尾号8280的位置
- 那这个对象里面有什么属性呢?
- 这里面有些属性好像看得懂
__name__
__str__
- 去看看
__name__
是函数对象的函数名字__str__
是函数对象的字符串输出形式- 还有个
__globals__
什么意思
- 得到的是一个字典
- 我添加一些变量
- 再去观察
- 函数的全局变量中确实可以找到global_temp
- 但是局部变量local_temp去哪里找
- dir(fun)的结果中
- 有个code对象
- 代码对象里面有些什么呢?
- 这都什么意思呢?
- 去手册那里搜一下
- 有一个inspect模块
- 里面有各种属性
- 尝试用导入(import)
- 结果是一个列表
- 尝试分行输出
- 找到里面和局部(local)变量相关的
- co_nlocals
- co_varnames
- 此函数有一个局部变量
- 叫做local_temp
- 如果再来一个局部变量呢?
- 确实跟着改变
- 还可以查看什么呢?
- 这就是这个函数对应的字节码
- 还有通过dis找到的对应的反汇编
- 函数其实是对应着一个code object
- 各种东西都放在这个object里面
- 函数(fun)是一个套路
- 但是落实到代码上是一个对象
- 这个fun对象里面有个
__code__
对象 - 这就是code object
- code object里面有这个函数的各种信息
- 函数名
- 内部变量数量和元组
- 字节码
- 既然函数本质上是一个对象
- 那么可以把函数作为实参来传递么?🤔
- 我们下次再说👋