Skip to content

Latest commit

 

History

History
206 lines (145 loc) · 6 KB

191-529964-全局_global_变量声明.sy.md

File metadata and controls

206 lines (145 loc) · 6 KB
show version enable_checker
step
1.0
true

global 全局

回忆

  • 上次我们研究了变量的作用域(scope)有两种
    • 主程序定义的是全局变量(global)
      • 全局变量全局可见
      • 全局变量在子函数中也可见
      • 全局变量可见性的作用域是主程序从头到尾包括子函数内部
    • 子函数定义的是形式参数(parameter)、局部变量(local)
      • 这两种变量在子函数内部可见
      • 而在主程序中不可见
      • 局部变量的可见性的作用域是子函数内部
  • 但是如果子函数局部变量和主程序中的全局变量同名
  • 会发生什么呢?🤔

主程序、子函数变量名冲突

  • 先构造好验证代码

图片描述

图片描述

  • global_test函数内的局部变量
  • 是独立的
  • 和主程序中的全局(global)变量无关
  • 如果是parameter又会如何呢?

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呢?

global关键字

图片描述

  • 这样局部的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的局部变量
    • 在主程序部分不可见
  • 主程序也有变量
  • 子函数也有变量
  • 应该如何理解呢?🤔
  • 我们下次再说👋