上一章的是函数的基础,因为函数在运用过程中,是可以嵌套的,函数中是会涉及到变量的,为了明确各自变量的使用范围,系统是有一套规则或者原则的,这就是作用域的概念

本章重点内容

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章 问答环节

2019.12.02-2019.12.08 第02章,已完成:《Python学习手册 第五版》 -第2章 Python如何运行程序

2019.12.09-2019.12.15 第03章,已完成:《Python学习手册 第五版》 -第3章 你应如何运行Python程序

2019.12.16-2019.12.22 第04章,已完成:《Python学习手册 第五版》 -第4章 介绍Python对象类型

2019.12.23-2019.12.29 第05章,已完成:《Python学习手册 第五版》 -第5章 数值类型

2019.12.30-2020.01.05 第06章,已完成:《Python学习手册 第五版》 -第6章 动态类型

2020.01.06-2020.01.12 第07章,已完成:《Python学习手册 第五版》 -第7章 字符串基础

2020.01.12-2020.01.19 第08章,已完成:《Python学习手册 第五版》 -第8章 列表与字典

2020.01.20-2020.01.26 第09章,已完成:《Python学习手册 第五版》 -第9章 元组、文件与其他核心类型

2020.01.27-2020.02.02 第10章,已完成:《Python学习手册 第五版》 -第10章 Python语句简介

2020.02.03-2020.02.09 第11章,已完成:《Python学习手册 第五版》 -第11章 赋值、表达式和打印

2020.02.10-2020.02.16 第12章,已完成:《Python学习手册 第五版》 -第12章 if测试和语法规则

2020.02.17-2020.02.23 第13章,已完成:《Python学习手册 第五版》 -第13章 while循环和for循环

2020.02.24-2020.03.01 第14章,已完成:《Python学习手册 第五版》 -第14章 迭代和推导

2020.03.02-2020.03.08 第15章,已完成《Python学习手册 第五版》 -第15章 文档

2020.03.09-2020.03.15 第16章,已完成:《Python学习手册 第五版》 -第16章 函数基础

2020.03.16-2020.03.22 第17章,已完成

2020.03.23-2020.03.29 第18章,未完成

2020.03.30-2020.04.05 第19章,未完成

以下链接,可以供你了解这个学习笔记的所有章节最新进度

自学笔记系列:《Python学习手册 第五版》 -写在开始之前

《Python学习手册 第五版》 -第17章 作用域的更多相关文章

  1. 《Python学习手册 第五版》 -第18章 参数

    在函数的定义和调用中,参数是使用最多喝最频繁的,本章内容就是围绕函数的参数进行讲解 本章重点内容如下: 1.参数的传递 1)不可变得参数传递 2)可变得参数传递 2.参数的匹配模式 1)位置次序:从左 ...

  2. 《Python学习手册 第五版》 -第15章 文档

    本章主要介绍Python中的文档,会通过多种方式来说明,如果查看Python自带文档和其他参考的资料 本章重点内容 1.#注释:源文件文档 2.dir函数:以列表显示对象中可用的属性 3.文档字符串 ...

  3. 《Python学习手册 第五版》 -第16章 函数基础

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  4. 《Python学习手册 第五版》 -第13章 while循环和for循环

    上一章已经讲过if条件语句,这章重点是循环语句:while.for 本章的重点内容 1.while循环 1)一般形式 2)break.continue.pass和循环的else 2.for循环 1)一 ...

  5. 《Python学习手册 第五版》 -第12章 if测试和语法规则

    本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.i ...

  6. 《Python学习手册 第五版》 -第11章 赋值、表达式和打印

    上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的 ...

  7. 《Python学习手册 第五版》 -第10章 Python语句简介

    前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...

  8. 自学笔记系列:《Python学习手册 第五版》 -写在开始之前

    今年双十一,在当当网上买了这本书,很厚很厚的一本书,大概有将近1700页左右,的确是一个“大工程”, 关于这本书的学习,我想采用一种博客的方式进行,既是写给自己,也想分享给每一个对Python学习感兴 ...

  9. 《Python学习手册 第五版》 -第14章 迭代和推导

    承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...

随机推荐

  1. maven依赖找不到,快速解决

    以微信支付依赖为例子 wxpay-sdk-3.0.9.jar1.阿里云仓库搜索地址https://maven.aliyun.com/mvn/search 2.搜索你要找的依赖,对号入座 3.确保mav ...

  2. Starting php-fpm [18-Jun-2019 12:56:59] NOTICE: PHP message: PHP Warning: Version warning提示报错解决

    php-fpm在命令行重启时出现如下提示信息在终端上,虽然不影响使用,但是不够干净利落,参考了一篇国外博客得以解决,参考链接:https://community.centminmod.com/thre ...

  3. zookeeper 单机部署

    第一步:下载安装包 这里以3.4.11为例  https://archive.apache.org/dist/zookeeper/ 点进去看: 下载tar文件 第二步:上传到服务器 使用ftp工具上传 ...

  4. pandas入门(一):pandas的安装和创建

    pandas 对于数据分析的人员来说都是必须熟悉的第三方库,pandas 在科学计算上有很大的优势,特别是对于数据分析人员来说,相当的重要.python中有了Numpy ,但是Numpy 还是比较数学 ...

  5. Uber刷单,刷出中国的人性劣根?

         美国叫车应用Uber国际化之路一直挺顺利的,融资也挺顺利的,他们现在很有钱,最新总融资金额达到100亿美元,创下美国非上市高科技公司的融资纪录.全新的商业模式,以及优质的客户体验,让Uber ...

  6. 从谷歌到脸书:为何巨头纷纷“钟情于”VR相机?

    VR的火爆,自然无需多言.而基于VR这一个概念,已经在多个相关行业不断衍生出新的产品.服务或内容.VR眼镜.VR头盔.VR相机.VR游戏.VR影视.VR应用--但VR产业的发展并不是齐头并进,而是出现 ...

  7. Python——11面向对象编程基础

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  8. MySQL多表查询、事务、DCL:内含mysql如果忘记密码解决方案

    MySQL多表查询.事务.DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...

  9. NumPy——统计函数

    引入模块import numpy as np 1.numpy.sum(a, axis=None)/a.sum(axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组,不指定 ...

  10. Nuxt 项目性能优化调研

    性能优化,这是面试中经常会聊到的话题.我觉得性能优化应该因具体场景而异,因不同项目而异,不同的手段不同的方案并不一定适合所有项目,当然这其中不乏一些普适的方案,比如耳熟能详的文件压缩,文件缓存,CDN ...