上一章的是函数的基础, 因为函数在运用过程中, 是可以嵌套的, 函数中是会涉及到变量的, 为了明确各自变量的使用范围, 系统是有一套规则或者原则的, 这就是作用域的概念
本章重点内容
1, 作用域: 作用域的概念
2, 全局作用域和局部作用域
3,global 和 nonlocal 的使用
接下来详细说明
1, 作用域
作用域主要是针对函数中的变量使用而言的, 也就是一个变量被定以后, 他可以影响的范围, 从计算机的运行角度看, 如果计算机调用一个变量, 应该去哪找? 这里的 "哪" 就是作用域
2, 全局作用域和局部作用域
既然是作用域, 那肯定有大小之分, 大概的可以分为两个方向, 就是全局作用域和局部作用域
全局作用域: 就是变量定义后, 影响全局, 这里的全局就是你编写的全部代码, 称该变量为全局变量
局部作用域: 就是变量定以后, 只能影响一段代码的范围, 其他地方如果使用时, 就无法调用了, 只在局部范围内可用, 也称该变量为局部变量
以上是文字的解释, 可能仅仅通过文字, 不容易理解, 那结合代码示例, 可以更容易一些:
上面的代码是说明的全局作用域, 首先定义了变量 X, 又定义了函数 func(), 在函数内部调用了 X, 而后面我们在使用函数 func()的时候, 会发现, 函数内部使用的 X 就是我们定义的 X, 而如果我们直接打印 X, 那显示的也是 X, 在这段代码中, X 就是全局变量
在上述代码的基础上, 我们增加局部变量, 代码示例如下:
通过以上代码, 在函数 func()内部, 重新定义了一个变量 X, 在我们调用函数 func()的时候, 会发现, 和上次的代码显示不一样了, 函数 func()使用的是变量 X='Ni', 那为什么不是 X='spam'呢?
其实这里就是局部作用域的问题, X='spam'是全局变量, X='Ni'是函数内的变量, 也成为局部变量, 而函数在调用变量的时候, 是要先查找临近的变量使用, 也就是 "就近原则", 所以 func()函数使用的是变量 X='Ni'
那 print(X)为什么调用的是变量 X='spam', 这是因为局部变量只能影响函数局部, 不会作用在函数外面, 而 print(X)是函数外面单独的语句, 所以它调用的是全局变量 X='spam'
有时候你会想, 在函数内部, 对变量的操作, 你就想要改变外面全局变量的数值, 那怎么办? 可以通过 global 和 noclocal 来实现
3,global 和 nonlocal 的使用
为了解决全局变量和局部变量之前的 "互动" 问题, 系统可以通过 global 和 nonlocal 关键词实现
global: 通过词义就基本可以理解, 指的是全局的意思, 如果变量前面有该关键词, 那变量不管是在 函数内部, 它也会影响函数外面的变量
nonlocal: 在使用上, 和 global 有很多相似之处, 但是也有自己的特点, 下面通过代码说明, 因为代码是最直观和最有效的
承接上面的代码示例, 如果想将函数 func()内 X 变量的调整, 影响到全局, 那就是增加 global 关键字就可以了, 代码如下:
可以比对与之前代码的不同, 在函数 func()内, 通过 global 关键字将 X 申明为全局变量, 所以 X='Ni'就改变了 X='spam', 所以在最后一行 print(X)时候, 此时的全局变量 X 已经变为'Ni', 所以最后打印的是'Ni'
那如果我们将上面的代码中 global 关键字换成 nonlocal 会怎么样呢? 代码运行如下:
在运行代码的时候, 提示错误, 由此可以看到, 不能直接替换, 那 nonlocal 如何使用呢?
nonlocal 必须使用在嵌套函数中, 也就是说, 至少有两层函数, 而且还是在第二层函数中, 才能使用 nonlocal, 依次, 我们修改上面的代码, 运行如下:
我们嵌套了一层函数, 在这里就可以正常运行了, nonlocal 语句运行内嵌函数修改定义在语法上位于外层的函数作用域中的一个或多个名称, 在此处, 就是允许函数 func2()内的变量 X 使用函数 func1()中变量 X, 所以 func2()内对变量 X 的修改, 影响到了函数 func1(), 所以函数 func1()内打印 X 就是打印的 X='Ni2', 在代码的最后一行, print(X)打印的还是 X="spam', 这是因为 X="spam'还是全局变量, 虽然函数内的变量都有修改, 依然不影响全局变量
如果上面的代码没有 [nonlocal X] , 代码会如何运行? func1() 会显示什么?
如果上面代码, 在函数 func1()中, 增加 [global X] , 代码会如何运行? print(X) 会显示什么?
你可以亲自试试看!
以上, 就是本章的重点内容说明, 下章再见!
《Python 学习手册 第五版》 每章时间规划及完成进度:
2019.11.25-2019.12.01 第 01 章, 已完成:《Python 学习手册 第五版》 - 第 1 章 问答环节 https://www.cnblogs.com/zhangjiyou/p/11964874.html
2019.12.02-2019.12.08 第 02 章, 已完成:《Python 学习手册 第五版》 - 第 2 章 Python 如何运行程序 https://www.cnblogs.com/zhangjiyou/p/11964879.html
2019.12.09-2019.12.15 第 03 章, 已完成:《Python 学习手册 第五版》 - 第 3 章 你应如何运行 Python 程序 https://www.cnblogs.com/zhangjiyou/p/12014092.html
2019.12.16-2019.12.22 第 04 章, 已完成:《Python 学习手册 第五版》 - 第 4 章 介绍 Python 对象类型 https://www.cnblogs.com/zhangjiyou/p/12046853.html
2019.12.23-2019.12.29 第 05 章, 已完成:《Python 学习手册 第五版》 - 第 5 章 数值类型 https://www.cnblogs.com/zhangjiyou/p/12089259.html
2019.12.30-2020.01.05 第 06 章, 已完成:《Python 学习手册 第五版》 - 第 6 章 动态类型 https://www.cnblogs.com/zhangjiyou/p/12112220.html
2020.01.06-2020.01.12 第 07 章, 已完成:《Python 学习手册 第五版》 - 第 7 章 字符串基础 https://www.cnblogs.com/zhangjiyou/p/12216223.html
2020.01.12-2020.01.19 第 08 章, 已完成:《Python 学习手册 第五版》 - 第 8 章 列表与字典 https://www.cnblogs.com/zhangjiyou/p/12227832.html
2020.01.20-2020.01.26 第 09 章, 已完成:《Python 学习手册 第五版》 - 第 9 章 元组, 文件与其他核心类型 https://www.cnblogs.com/zhangjiyou/p/12236252.html
2020.01.27-2020.02.02 第 10 章, 已完成:《Python 学习手册 第五版》 - 第 10 章 Python 语句简介 https://www.cnblogs.com/zhangjiyou/p/12237360.html
2020.02.03-2020.02.09 第 11 章, 已完成:《Python 学习手册 第五版》 - 第 11 章 赋值, 表达式和打印 https://www.cnblogs.com/zhangjiyou/p/12247511.html
2020.02.10-2020.02.16 第 12 章, 已完成:《Python 学习手册 第五版》 - 第 12 章 if 测试和语法规则 https://www.cnblogs.com/zhangjiyou/p/12250667.html
2020.02.17-2020.02.23 第 13 章, 已完成:《Python 学习手册 第五版》 - 第 13 章 while 循环和 for 循环 https://www.cnblogs.com/zhangjiyou/p/12292114.html
2020.02.24-2020.03.01 第 14 章, 已完成:《Python 学习手册 第五版》 - 第 14 章 迭代和推导 https://www.cnblogs.com/zhangjiyou/p/12352950.html
2020.03.02-2020.03.08 第 15 章, 已完成:《Python 学习手册 第五版》 - 第 15 章 文档
2020.03.09-2020.03.15 第 16 章, 已完成:《Python 学习手册 第五版》 - 第 16 章 函数基础 https://www.cnblogs.com/zhangjiyou/p/12440951.html
2020.03.16-2020.03.22 第 17 章, 已完成
2020.03.23-2020.03.29 第 18 章, 未完成
2020.03.30-2020.04.05 第 19 章, 未完成
以下链接, 可以供你了解这个学习笔记的所有章节最新进度
来源: http://www.bubuko.com/infodetail-3460635.html