-
node.js 函数外定义的变量 函数内赋值后为什么不能带出_(44)python少儿编程之函数(五)--- 作用域...
2020-12-17 13:56:56函数嵌套在一个函数内定义了另一个函数如图,定义了一个outer函数,然后在outer函数里面又定义了一个inner()函数,此时我们只能在outer函数调用inner()函数,如果在outer函数外调用inner函数就会报错,那这里就引出...函数嵌套
- 在一个函数内定义了另一个函数
- 如图,定义了一个outer函数,然后在outer函数里面又定义了一个inner()函数,此时我们只能在outer函数调用inner()函数,如果在outer函数外调用inner函数就会报错,那这里就引出了一个概念,作用域。
- 函数有可见范围,这就是作用域的概念
- inner这里成为是outer函数的内部函数,不能在外部直接被调用,否则就会报错!
作用域
- 一个标识符的可见范围,这就是标识符的作用域,一般常说的是变量的作用域。
- 全局作用域
- 在整个程序运行环境中都可见
- 局部作用域
- 在函数、类等内部可见
- 局部变量使用范围不能超过其所在的局部作用域
- 如图,x就是全局作用域 fn1和fn2函数都可以使用 但是y就是只能在fn1内使用,如果再fn2使用就会报错!
- 为了更明确的理解,我们再来看一个例子
- 都为o,一个是outer2函数的变量,一个是内部函数inner的变量,当我们更改了内部函数o的值你会发现,内部函数打印出来的是97,但是在在外部函数继续打印的时候,还是原来的65,内部函数的更改,其实没有影响外部变量o的值,所以这个例子更能反映作用域的概念!
- 从这个例子可以看出
- 外层变量作用域在内存作用域是可见的
- 内层作用域,如果定义了o = 97,其实相当于重新定义了一个变量o,但是这个o并没有覆盖外层作用域outer中的o
- 我们再来看一个例子
- 如图,首先我们全局变量定义了一个x,然后在函数内做了自加1的操作,然后系统就报错了,这是为什么呢?
- 其实这里也解释了上面的概念,首先x += 1 就是 x = x +1 ,这个操作等于在foo函数里面又定义了一个x变量,就跟外面的x无关了,但是这个x都没赋值过,也不知道什么类型,然后就去 +1,自然就报错了!
- 那怎么解决这个问题呢,有时候我们就想用这个全局变量呢?
全局变量global
- 如图,使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x
- 全局作用域中必须有x的定义
- 那如果全局作用域没有这个定义呢? 答案是要报错的!
- 那再思考一个问题,如果在内部函数定义全局变量以后,外部能访问到吗?
- 如图,我在foo函数内,定义了一个x=10,然后加1,在外部打印后变成11,说明结果正确!这里的x的作用域一直都是全局的!
- globel总结
- 内部作用域使用x=10的赋值语句会重新定义局部作用域使用的变量x,但是这个作用域一旦使用过globe声明过,那么x=10就等于为全局作用域的变量x赋值
- 但是即使外部作用域的变量可以在内部作用域使用,但也不要直接那样用,函数就是为了封装,跟外界隔离,尽量用函数的形参传参来解决,所有,最后总结一句话,就是不要用 globel,学习它只是为了深刻理解变量作用域而已!切记!
好了,今天的课程就到这里,此章节还是比较重要的,好好练习一下!
-
C++外部变量定义与使用
2019-04-26 19:54:49外部变量只能被定义一次, 而且在函数内对外部变量的引用必须进行声明, 可用extern语句进行显示声明, 也可以上下文隐式声明, 假如在函数内定义了与外部变量名称相同的变量, 则不会使用外部变量, 而是以当前定义变量...不同于Java与C#, C++的变量与函数不一定存在于类中. 在C++中, 定义于函数外的变量称为外部变量, 函数内的变量称为局部变量, 也叫自动变量. 外部变量只能被定义一次, 而且在函数内对外部变量的引用必须进行声明, 可用extern语句进行显示声明, 也可以上下文隐式声明, 假如在函数内定义了与外部变量名称相同的变量, 则不会使用外部变量, 而是以当前定义变量使用.
如图
在main函数外定义了一个int型变量i并初始化为1, 在main函数内也定义了一个int型变量i并初始化为2, 此时在main函数中对i进行输出, 则不会使用外部变量i, 而是使用main函数内的变量i.
输出结果如图
那么此时如果我们需在main函数中使用外部变量i, 则需在main函数中用extern显示声明, 如图
注意, 在这条语句中不可再对i进行赋值, 例如
会被编译器提示不可对外部变量的局部声明进行初始化, 当然, 可以在其他语句中再对i进行赋值, 如图
外部变量的作用域范围为全局范围, 也就是说, 在其他文件中定义的外部变量在当前文件也是可以使用的, 且会因为命名而发生冲突, 但是需要在使用外部变量的时候对其用extern声明.由于外部变量的作用域特性, 导致其定义位置是无关的, 也就是说, 无论外部变量i定义在main函数后还是前, 在main函数中都可以以extern语句进行引用.
-
全局变量与局部变量,静态变量与动态变量,内部函数与外部函数的区别
2020-06-16 10:15:28一、变量按作用域范围分类 局部变量:在函数内定义的变量,作用域限于函数内。...全局变量:在函数外定义的变量,它的作用域是从变量定义开始,到程序文件的末尾。如果在定义点前的函数要使用该外部变量,要一、变量按作用域范围分类
局部变量:在函数内定义的变量,作用域限于函数内。
说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。
(2)形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量。
(3)允许在不同的函数中使用相同的变量名,但它们代表不同的对象,占用不同的存储单元,互不干扰。
(4)在复合语句中也可以定义变量,但其作用域只能在复合语句内。
全局变量:在函数外定义的变量,它的作用域是从变量定义开始,到程序文件的末尾。如果在定义点前的函数要使用该外部变量,要使用关键字extern。
说明:(1)全局变量由于一个文件中所有函数都能引用全局变量的值,因为在一个函数中能够改变了变量的值会对其他函数产生影响,带来不安全性,并且一直占用存储空间,所以不建议用
(2)全局变量和局部变量同名时,在函数中全局变量隐藏,局部变量起作用。
实例:#include <stdio.h> void gx(); void gy(); int main() { extern int x,y; ///用extern将外部变量的作用域扩展到前面 printf("1:x=%d,y=%d\n",x,y); y=246; gx(); gy(); return 0; } void gx() { extern int x,y; //用extern将外部变量的作用域扩展到前面 x=135; printf("2:x=%d,y=%d\n",x,y); } int x,y; //定义外部变量 void gy() { printf("3:x=%d,y=%d\n",x,y);
二、变量按生存周期分类
动态变量:动态变量在函数调用时分配存储空间,函数调用结束后释放存储空间。它可以是函数的形参,局部变量,函数调用时的现场保护和返回地址。
静态变量:在运行期间由系统分配固定的存储空间,在静态存储区的变量。它可以是全局变量,也可以是局部变量。几个关键字:
- auto:动态变量,一般可省略。
- static:静态变量,分为静态局部和静态全局。
(1)静态局部变量:它和局部变量的区别在于函数退出时,变量始终存在,但不能被其他函数使用,当再次进入该函数时,能保存上次的结果继续使用。如果不赋初值,则自动赋初值0或空字符。
(2)静态全局变量:只在定义它的源文件中可见,在其他源文件中不可见。它和全局变量的区别是,全局变量可以使用关键字extern被其他源文件使用,而静态全局变量不能。 - register:寄存器变量,不存入内存,直接保存在CPU内的寄存器中,提高执行速度。一般把使用最频繁的变量定义为register变量,如循环变量。它不能是静态变量,只能是动态变量。
例如:
{ register int i; for(i=0;i<n;i++) { ... } ... }
三、按函数能否被其他源文件使用,分为内部函数和外部函数
内部函数: 只能被本程序文件调用,和其他文件中的同名函数互不干扰。使用关键字static+函数。例如:
static int max(int a,int b) { ... }
外部函数: 可以被其他文件调用,使用关键字extern+函数,如果省略extern,则默认为外部函数。例如:
extern int fun(int x,int y) { ... }
实例:
#include <stdio.h> void func();//函数声明,主要是因为被调用的函数定义写在了main函数后面了 int n = 1; //全局变量 int main(void) { static int a; // 静态局部变量,但静态局部变量只在定义它的函数中可见,并且只初始化一次 int b = -10; // 局部变量 printf("main: a=%d, b=%d, n=%d\n",a,b,n); b += 4; func(); printf("main: a=%d, b=%d, n=%d\n",a,b,n); n += 10; func(); printf("main: a=%d, b=%d, n=%d\n",a,b,n); } void func() { static int a = 2; // 静态局部变量 int b = 5; // 局部变量 a += 2; n += 12; b += 5; printf("func: a=%d, b=%d, n=%d\n",a,b,n); }
运行结果:
结果分析:首先明确main函数和func函数里面都有静态局部变量a和局部变量b,由于它们的固有性质,它们都只在定义它的函数里有效,所以它们互不干扰,所以只要在本函数里分析即可,而全局变量n,在main和func函数里都有效,所以分析它的值应该考虑n在这两个函数里的变化
-
全局变量、局部变量、静态局部变量、静态全局变量、外部变量、外部函数和静态函数
2017-04-09 15:37:29定义在函数外,不属于任何函数,生存周期为定义开始直到程序运行结束,作用范围为所有函数。 2局部变量 一般定义在函数或复合语句的开头,生存周期为定义直到所在函数或复合语句调用结束,作用范围为所在函数或复合...1.全局变量
定义在函数外,不属于任何函数,生存周期为定义开始直到程序运行结束,作用范围为所有函数。
定义格式:变量类型 变量表(定义在函数外)
2.全局静态变量
与全局变量类似,但其作用范围被限制在当前的程序文件模块中。即使其他文件模块使用外部变量声明,也不能使用该变量。
定义格式:static 变量类型 变量表;(定义在函数外)
3.局部变量
一般定义在函数或复合语句的开头,生存周期为定义直到所在函数或复合语句调用结束,作用范围为所在函数或复合语句。
定义格式: 变量类型 变量表;(定义在函数或复合语句内)
4.局部静态变量
与局部变量类似,只不过其生存周期为定义开始直到程序运行结束。其赋初值只会在函数第一次调用时起作用,若没有赋值,自动赋值为0。
定义格式:static 变量类型 变量表;(定义在函数或复合语句内)
5.外部变量
使已经定义的全局变量的作用范围扩展到其他程序文件模块。
定义格式:static 变量表;(定义在函数外)
6.外部函数
在一个模块中调用另一个模块中的函数时,需要进行函数的外部调用声明。
格式:extern 函数类型 函数名(参数表);
7.静态函数
限制当前模块中定义的函数,使其不能被外部模块调用。
格式:static 函数类型 函数名(参数表);
-
【Python】闭包的实现原理,如何在内部函数修改外部函数的变量
2019-01-19 17:45:16闭包是指在一个函数中定义了一个另外一个函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 。 闭包的使用,可以隐藏内部函数的工作细节,只给外部使用者提供一个可以... -
C程式中外部变量和函数关系解惑
2011-09-30 13:15:49C程式中外部变量和函数关系解惑 ...变量能够分为函数内部定义、使用的变量和函数外部定义的变量,通常情况下,把函数内部定义、使用的变量称为内部变量或局部变量,而将在函数外部定义的、供许多函数所使用的变量称为外 -
php函数内不能访问函数外的变量原因
2019-10-03 09:40:07php函数内不能访问函数外的变量原因 ...这个问题,即函数内部不可以访问外部的变量,如果想访问,如上,则在函数内部加 global $i。 用户在php中定义的变量都可以在一个HashTable中找... -
外部变量
2011-06-28 14:43:00在函数中声明的局部变量是不能被其他函数直接访问的,每个局部变量只在本函数范围内有效(main函数中定义的局部变量也是不能被其他函数直接调用的。)。 除局部变量外,还可以定义位于所有函数外部的变量(即全局... -
php调用函数外的变量
2015-01-14 12:28:19按照一般程序编写的思路,函数外的变量应该是可以看成全局变量的,如果是全局变量的话,那么在函数中调用是完全没有问题的。 看来php和我们传统的思路有点问题,那么php中全局变量是怎么的呢,我特意编写代码试试看... -
静态变量VS动态变量(自动变量) 静态存储VS动态存储 静态库VS动态库 静态函数(又称内部函数)VS外部函数
2011-10-28 19:57:17在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何... -
外部函数能修改闭包内的变量_Python函数式编程,Python闭包
2021-01-29 06:56:42作用域作用域是变量能被访问的范围,定义在函数内的变量是局部变量,局部变量的作用范围只能在函数内部,它不能在函数被外引用。定义在模块最外层的变量是全局变量,它是全局范围可见的,所以在函数体内部也可以读取... -
python函数作用域包括局部变量和参数_Python全局和局部变量[Python函数][Python全局变量范围][Python局部...
2021-01-29 11:22:24您的“关注”和“点赞”,是信任,是认可,是支持,是动力…如意见相佐,可留言。本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充...1.2 定义全局变量的方式1.2.1 在函数外定义全局变量在所有函数外定... -
python强势来袭-13-函数中的那些变量
2019-08-13 15:58:26函数中的变量 在函数中,我们可以看到也进行了变量的使用,那函数中的变量和函数外...# 定义在函数外部的变量 name = "tom" # 直接使用全局变量 print(tom) # if代码块中使用全局变量 print(tom) # 函数中使用全局变... -
python函数-变量作用域
2017-10-31 08:56:362.局部变量只在定义它的函数体内有效,在函数外即使使用同名的变量,也会被认为是另一个变量。 3. 全局变量在定义后的代码中都有效,包括它后面定义的函数体内,即若函数体内和函数体外的变量同名同值,该... -
《零基础入门学习Python》学习过程笔记【020函数的局部变量和全全局变量内部函数和闭包】
2017-07-31 21:27:221.在函数外面定义一个a,在函数里面改变这个a,这两个是否为一个东西?...2.如何在函数内部为在函数外定义的变量赋值?(global) 注:没有global是不可能在函数内部为在函数外部定义的变量赋值的 用法: -
函数的变量声明提升
2020-03-18 23:04:57变量只在函数内部存在 函数外部声明变量就是全局变量 函数内部定义的变量外部无法读取,顾称 局部变量 使用规则: 函数允许访问函数外的变量 整个代码结构中只有函数可以限定作用域 作用域规则首先使用提升规则分析 ... -
5.6Python函数(6):变量作用域
2018-03-03 12:33:02@局部变量&...全局变量是定义在函数外的变量,函数内外都可以访问; 函数内访问全局变量要使用global关键字; 全局变量的生命周期与程序本身是相同的(除非使用del xxx进行删除); @形式参... -
变量与函数深入研究
2020-09-15 22:01:37变量与函数深入研究1.全局变量1.1. static全局变量2.局部变量2.1.补充2.2. 局部变量的内存分配2.3. static局部变量1)内存中的位置...在函数外定义的变量称为全局变量,也称外部变量,全局变量的作用域较广,全局变量不 -
javascript函数变量的作用域
2017-04-12 10:35:012、在函数外定义的变量可以称为全局变量,它在页面声明此变量后的任何程序段位置都可以使用,使用全局变量,可以实现不同程序段之间的数据传递。 3、如果将变量定义在函数的内部,那么这个变量称为局部变量,它的... -
局部变量和全局变量,静态局部变量和静态全局变量,全局函数和静态函数
2020-04-03 13:38:33定义在函数外,可被本文件及其他文件的函数使用(外部链接),其他文件使用时序用extern声明 生命周期和程序运行周期一样 不同文件的全局变量不可以重名 局部变量 如果没有赋初值,内容为随机 如果定义在符合语句... -
C语言中的全局变量定义与使用
2016-04-18 21:55:26在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束。 建立全局变量的作用是增加了... -
C语言中全局变量的定义与调用
2014-09-11 11:28:03在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束。 建立全局变量的作用是增加了... -
我与python约个会:13.1 函数中的变量
2017-05-19 10:31:351. 函数中的变量 在函数中,我们可以看到也进行了变量的使用,那函数中的变量和函数外的变量到底有什么区别...# 定义在函数外部的变量 name = "tom" # 直接使用全局变量 print(tom) # if代码块中使用全局变量 print(t -
php基础之预定义变量(get,session)
2018-11-22 09:15:17局部作用域:在函数内部定义的变量,就称为局部作用域,不能在函数外使用; 超全局作用域:没有使用限制,并且有的超全局是可以跨脚本的。 (1)$_get 说明:就是接受表单 超链接的方式: POST:接... -
深入浅出理解局部、全局、静态、动态、外部变量
2014-09-25 11:24:551、全部变量、局部变量 ...全部变量:函数外定义+全局可见+存放在内存的全局数据区+未初始化的的时候为0 局部变量:函数内定义+函数内可见+存放在栈区,函数退出变量消失+不显式初始化内容不可预知 -
C/C++外部链接的静态变量
2020-03-23 12:11:08外部链接的静态变量具有文件作用域、外部链接和静态存储期。 该类别有时称为外部存储类别(external storage class),...当然,为了指出该函数使用了外部变量,可以在函数中用关键字extern再次声明。如果一个源代码... -
《编写高质量代码:改善c程序代码的125个建议》——建议8-2:慎用extern声明外部变量...
2017-05-02 11:00:00本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第1章,建议8-2,作者:马 伟 更多章节内容可以访问云栖...在函数内定义的变量是局部变量,而在函数之外定义的变量则称为外部变量,外...
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
基于springboot实现表单重复提交.docx
-
辅助控制器来料检验规范模版.docx
-
项目管理工具与方法
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
xxx讲话实录.zip
-
信息安全管理与信息安全体系实践.ppt
-
列表(list)方法
-
店铺无忧管理系统.V5版本的案例数据库
-
MySQL 多实例安装 及配置主从复制实验环境
-
spring源码学习(二)不得不学的IoC容器的初始化过程
-
560_linux内核学习_sched.c文件sched_init函数分析
-
实现 MySQL 读写分离的利器 mysql-proxy
-
自制的mnist数据集
-
【布道者】Linux极速入门
-
第四次CCF计算机软件能力认证 节日 (模拟)
-
MMM 集群部署实现 MySQL 高可用和读写分离