show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次我们研究了变量的作用域(scope)有两种
- 主程序定义的是全局变量(global)
- 全局变量全局可见
- 全局变量在子函数中也可见
- 全局变量可见性的作用域是主程序从头到尾包括子函数内部
- 子函数定义的是形式参数(parameter)、局部变量(local)
- 这两种变量在子函数内部可见
- 而在主程序中不可见
- 局部变量的可见性的作用域是子函数内部
- 主程序定义的是全局变量(global)
- 但是如果子函数局部变量和主程序中的全局变量同名
- 会发生什么呢?🤔
- 先构造好验证代码
- global_test函数内的局部变量
- 是独立的
- 和主程序中的全局(global)变量无关
- 如果是parameter又会如何呢?
- 运行结果
- temp在主程序中temp是
- 全局的temp
- temp在test()函数里面
- 被替换为局部的temp
- 跳出test()之后,回到主程序时
- temp还是原来的全局的那个temp
- 这种现象叫做局部变量对于全局变量的屏蔽(shadow)
- 全局变量在函数内部被暂时放到了阴影(shadow)中
- temp在主程序中temp是
- 全局的temp
- 指向尾号7248的地址
- temp在test()函数里面
- 首先完成的是参数赋值
- 局部(local)的temp也指向尾号7248的地址
- 全局(global)的temp被屏蔽(shadow)
- 局部的(local)的temp指向了尾号0928的地址
- 全局(global)的temp指向地址没有变
- 跳出test()之后,回到主程序时
- temp指的还是原来的全局(global)的那个temp
- 此时已经不在函数内
- 没有局部(local)变量temp一样
- 虽然都叫temp
- 但是内部的会屏蔽外部的
- 等效于后面的这个
- 确实可以了
- 局部(local)的还是局部的
- 全局(global)的还是全局的
- 在函数内部
- 局部的屏蔽了全局的
- 为什么会有这种屏蔽外界的现象呢?
- import 进来的各种模块(module)全局变量
- 难免会和函数局部变量重名
- 也许会影响到函数里面的私有变量
- 反过来也一样
- 互相影响容易乱
- 如果我就是想要
- 局部temp同时也是全局temp
- 而不是屏蔽全局temp呢?
- 这样局部的temp就是全局的temp
- 这种情况下可以对全局变量重新赋值么?
- 在函数内部对于全局变量重新赋值
- 在函数内部完成了对全局变量的重新赋值
- 我可以在函数内部定义新的全局变量并使用么?
- 确实是可以的
- 非global的变量
- 在函数结束的时候
- 是会被del释放空间的
- 而global变量就不会
- 不过前提是函数必须运行过
- 如果函数没有运行过呢?
- 如果函数没有运行过
- 就没有在函数中定义过全局变量temp
- 也就不能引用temp
- 他会找不到这个名字
- 这些说明还是有点漂浮
- 帮助怎么说的?
-
全局(global)声明可以管(hold)住整个当前代码块(code block)
-
具体说就是hold住当前文件模块(module)
-
标识符被解释成全局(global)的
-
不能声明成全局的变量有
- 形参(parameter)
- loop中的循环对象
- for line in lines:中的line
- global line 是不行的
- 类的定义
- 导入(import)
-
如果没有将temp声明为global呢?
- temp变量的作用域(scope)仅限于fun函数内部
- 主程序范围内找不到temp这个函数内的局部变量
- 你不说temp是全局(global)的
- temp默认就是内部(local)的
- 我们这次了解到函数参数的一些细节
- 全局变量和函数局部变量同名时
- 在函数内部
- 局部变量会屏蔽(shadow)全局变量
- 如果想要在函数内部访问重名全局变量
- 可以把同名局部变量声明为global
- 函数内部声明global的局部变量
- 不会在函数结束时消失
- 而是会作为全局变量存在
- 函数内部没有声明global的局部变量
- 在主程序部分不可见
- 主程序也有变量
- 子函数也有变量
- 应该如何理解呢?🤔
- 我们下次再说👋