Skip to content

Latest commit

 

History

History
116 lines (74 loc) · 3.17 KB

224-547554-[专业选修]非局部变量_nonlocal.sy.md

File metadata and controls

116 lines (74 loc) · 3.17 KB
show version enable_checker
step
1.0
true

非局部变量(nonlocal)

回忆

  • 上次学习了嵌套的函数定义

    • 在outer里面又定义了一个函数inner
    • 可以在outer里用程序调用inner
  • 这个嵌套层次可能有很多很多层

  • 简单来说就是

    • 外部定义的内部可见
    • 内部定义的外部不可见
    • 内外同名的内层屏蔽外层
  • 如果我就想让inner函数读写outer函数中的局部变量

  • 应该如何呢?🤔

图片描述

尝试定义

图片描述

  • 把这个东西定义成全局(global)的

图片描述

  • 主程序不认inner_local
  • 尝试在主程序中定义inner_local

修改

图片描述

  • 虽然变量的名字叫做inner_local
  • 但是他确实是一个全局变量

图片描述

  • 如果我只希望inner_local在outer函数中可见
  • 但是在主程序中不可见
  • 有可能么?

查找

  • 这个应该离着global的帮助文档不远

图片描述

  • nonlocal声明的变量
  • 必须是上一层函数中已经存在的局部(local)变量

正确用法

图片描述

图片描述

  • 上一层的直接父函数outer可以访问
  • 主程序能够访问inner_local么?

尝试

图片描述

图片描述

  • 主程序不能访问
    • 只有直接上一层的父函数能够访问
  • 在子函数inner中
    • 可以用nonlocal修改父函数outer中的局部(local)变量么?

修改

图片描述

图片描述

  • 确实可以修改
  • 如果给全局(global)的变量声明为nonlocal会如何呢?

global

图片描述

图片描述

图片描述

  • nonlocal不能声明已经声明为全局(global)的变量
  • 三个作用于类型!!!
    • local 本地可见 (默认)
    • global 全局可见
    • nonlocal 非本地可见(上一层函数也可见)

总结

  • 我们研究了nonlocal
  • nonlocal是控制变量作用域(scope)的关键字
  • 目前学了3个
    • global 全局可见
    • local 本地可见
    • nonlocal 非本地可见(上一层函数也可见)
  • 函数既然已经是封装(encapsulate)了的功能(function)
  • 为什么还要进一步封装呢?
  • 函数中的函数有什么意义呢?
  • 我们下次再说👋