全局变量和局部变量
- 格式:doc
- 大小:25.50 KB
- 文档页数:7
全局变量与局部变量1.全局变量:⽆缩进的变量,在整个代码中任意位置都可以调⽤2.局部变量:在⼦程序中设置的有缩进的变量,只能在⼦程序中调⽤3.局部变量与全局变量重名时,互相不影响,局部变量总是先从⾃⼰等层次的代码块中寻找,找不到在从外⾯⼀层找4.⼀般全局变量设置成⼤写形式,⽽局部变量设置成⼩写,便于区分5.例⼀:1def test():2print(name)3 test() #输出‘alex’name = 'alex'def test():name = 'pig'print(name)test() #输出pig6.在⼦程序中想修改全局变量时,可引⼊ globalname = 'alex'def test():global namename = 'pig'print(name)test() #输出pig7.函数嵌套name = 'alex'def test():name = 'pig'def test_1():name_1 = 'cat'print(name_1)def test_2():name_2 = 'dog'print(name_2)test_2()print(name)test_1()test() #依次输出pig,cat,dog8.前向引⽤:函数即变量函数之间互相引⽤时,不在乎函数的顺序,因为调⽤时均在内存⾥,但是由于执⾏命令是有顺序,执⾏的命令应在所涉及的所有函数之后,否则读取不到,会报错。
如:1def test():2 name = 'Mike'3print(name)4 test_1()5def test_1():6 name = 'John'7print(name)8test()9def test_1():10 name = 'John'11print(name)12def test():13 name = 'Mike'14print(name)15 test_1()16test()17def test():18 name = 'Mike'19print(name)20 test_1()21test()22def test_1():23 name = 'John'24print(name) #会报错,上⾯两个输出⼀样9.改变上⼀级变量,使⽤ nonlocaldef test():name = 'John'print(name)def test_1():nonlocal namename = 'Mary'print(name)test_1()test() #输出John,Mary10.全局变量不管在哪个⼦程序中始终可以修改(global形式)。
c语言全局变量和局部变量区别
全局变量和局部变量的区别有:1.有效范围不一样,2.内存空间不同,3.使用区间不同。
局部变量只在本函数范围有效,在此函数以外是不能使用这些变量;全局变量的有效范围是从定义变量的位置开始到本源文件结束。
局部变量是程序运行到该函数时给该变量分配内存空间,函数结束则释放该内存空间。
全局变量是程序运行时事先分配内存空间,当程序结束时释放内存。
全局变量:作用于整个程序文件;局部变量:作用于所属语句块或函数中。
全局变量的存有主要存有以下一些原因:采用全局变量可以挤占更多的内存(因为其生命期短),不过在计算机布局很高的今天,这个不必须算什么问题,除非采用的就是非常大对象的全局变量,能避免就一定必须防止。
采用全局变量程序运行时速度更慢一些(因为内存不须要再分配),同样也慢没法多少。
对于局部变量的名字空间污染,这个在不能采用太多变量时就是可以防止的。
当全局变量与局部变量下文的时候,起至促进作用的就是局部变量,全局变量被屏蔽掉。
还可以用extern在函数外对全局变量声明,并使全局变量的作用域从声明处至文件的完结。
全局变量的优先度高于局部变量。
总之,全局变量可以采用,但是全局变量采用时应特别注意的就是尽可能并使其名字不易认知,而且无法太短,防止名字空间的污染;防止采用非常大对象的全局变量。
在c语言等面向过程语言中,局部变量可以和全局变量下文,但是局部变量可以屏蔽全局变量。
在函数内提及这个变量时,可以使用同名的局部变量,而不能使用全局变量。
全局变量和局部变量的定义1、局部变量:定义在函数内部的变量就是局部变量,只能在其被声明的函数内部被访问。
这样的变量只在函数运⾏时存在,⼀旦退出函数,这些局部变量就都被销毁。
所有在函数内部声明的变量名称都将被加⼊作⽤域中。
⽰例如下:def printInfo(arg1, arg2) :sum = arg1 + arg2print "函数中的sum = ",sum#函数体外也定义了⼀个sum变量printInfo(5,6)sum = 1print "函数外的sum = ",sum运⾏结果如下:函数中的sum = 11函数外的sum = 1函数中的sum变量就是局部变量,只能在所在的函数中访问,即使在外⾯改变了sum变量的值,也不会影响函数中的sum变量的值。
2、全局变量:全局变量是在函数外定义的,可以在整个程序范围内访问,但是必须在所要访问的函数中使⽤关键词 global 声明函数外的变量为全局变量,这样访问的才是在函数外定义的全局变量。
⽰例代码:def printInfo(y) :global xsum = x + yprint "sum = ",sumx = 10printInfo(5)运⾏结果:sum = 15⼀旦变量被定义为全局变量后,在程序任何地⽅都可以访问,也可以修改。
所以我们不建议过多的使⽤全局变量(⾮必要不使⽤),因为这样可能会导致全局变量的不可预知性,并且全局变量也降低了函数或模块之间的通⽤性,同时也降低了代码的可读性,别⼈有可能不知道这个调⽤的是哪的变量。
全局变量与局部变量全局变量与局部变量:全局变量与局部变量两者的本质区别就是在于作⽤域⽤通俗的话来理解的话,全局变量是在整个py⽂件中声明,全局范围内都可以访问局部变量是在某个函数中声明的,只能在该函数中调⽤它,如果试图在超出范围的地⽅调⽤,程序就爆掉了如果在函数内部定义与某个全局变量⼀样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。
因此不建议这样使⽤,这样会使得程序很不健全作⽤域name = '张望';def func():name1= '诗仙'print('全局变量为:',name,'\n局部变量为:',name1)func()# 执⾏结果全局变量为:张望局部变量为:诗仙print("函数外直接打印全局变量:",name)# 函数外直接打印全局变量:张望print('函数外直接打印局部变量':name1) # 报错了,局部变量作⽤域仅在函数内部就近原则name = '张望';def func():name= '诗仙'print('全局变量为:',name)func()#执⾏结果:全局变量为:诗仙#当局部变量与全局变量⼀样时,取⽤就近原则,优先获取函数内部距离最近的变量,,如果没有再向外获取name = '张望';def func():#name= '诗仙'print('全局变量为:',name)func()#执⾏结果: 全局变量为:张望#函数内部没有,向外获取global关键字name = '张望';def func():global namename = '诗仙'print('全局变量为:',name)func()print('函数外打印全局变量:',name)# 执⾏结果:全局变量为:诗仙函数外打印全局变量: 诗仙# 使⽤global关键字就是告诉python编译器这个变量不是局部变量⽽是全局变量,其实有点像是"引⽤"的意思,可以简单理解为,此时 global name 就是全局变量 namenonlocal关键字字⾯意思就是指当前的这个变量不是局部变量。
C语言中的局部变量和全局变量在C语言中,局部变量和全局变量是两种不同的变量类型,它们分别用于特定的程序设计需求。
本文将介绍局部变量和全局变量的定义、作用域以及在使用中的注意事项。
一、局部变量的定义和作用域局部变量是在函数内部声明的变量,它们只能在其所在的函数内部使用。
当函数被调用时,局部变量会在内存中被分配空间,当函数执行完毕后,局部变量所占用的内存会被释放。
局部变量的定义方式为在函数内部声明变量的语句前加上数据类型。
局部变量的作用域仅限于所在的函数内部。
这意味着其他函数无法直接访问同一名称的局部变量。
每个函数都有自己独立的局部变量,它们之间不会相互干扰。
局部变量的作用域可以有效地避免命名冲突,提高代码的可读性和可维护性。
二、全局变量的定义和作用域全局变量是在函数外部声明的变量,它们在整个程序中都可以被访问和使用。
全局变量的定义方式为在所有函数外部声明变量的语句前加上关键字"extern"和数据类型。
全局变量的作用域跨越整个程序,它们在程序开始执行时分配内存,在程序结束时释放内存。
全局变量可以在多个函数中共享数值,这对于需要在不同函数之间进行数据传递和共享的场景非常有用。
然而,全局变量的使用也需要谨慎。
过多的全局变量会增加程序的复杂性,不利于代码的维护和调试。
全局变量的值可以被任何函数修改,如果使用不当,可能会导致数据混乱和错误的结果。
三、局部变量和全局变量的差异1. 作用域:局部变量仅在函数内部可见,全局变量在整个程序中可见。
2. 生命周期:局部变量在函数执行期间存在,函数执行完毕后消失;全局变量在程序执行期间一直存在。
3. 访问限制:局部变量只能在定义它们的函数内部访问,其他函数无法直接访问;全局变量可以被所有函数访问。
4. 冲突风险:局部变量具有更小的命名冲突风险,全局变量存在更大的命名冲突可能性。
四、局部变量和全局变量的使用注意事项1. 命名冲突:在使用局部变量和全局变量时,应当避免重复使用相同的变量名,以防止命名冲突和代码混乱。
局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。
全局变量与局部变量的区别2009-11-15 10:12一、变量的分类变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。
局部变量的值不可知。
静态全局变量,只本文件可以用。
全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束.省略了存储类型符,系统将默认为是自动型.静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存.自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的. 二、介绍变量的作用域在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。
这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。
这种变量有效性的范围称变量的作用域。
不仅对于形参变量,C语言中所有的量都有自己的作用域。
变量说明的方式不同,其作用域也不同。
C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
一、局部变量局部变量也称为内部变量。
局部变量是在函数内作定义说明的。
其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
例如:int f1(int a) /*函数f1*/{int b,c;……}a,b,c作用域int f2(int x) /*函数f2*/{int y,z;}x,y,z作用域main(){int m,n;}m,n作用域在函数f1内定义了三个变量,a为形参,b,c为一般变量。
在f1的范围内a,b,c 有效,或者说a,b,c变量的作用域限于f1内。
同理,x,y,z的作用域限于f2内。
m,n的作用域限于main函数内。
关于局部变量的作用域还要说明以下几点:1. 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。
同时,主函数中也不能使用其它函数中定义的变量。
因为主函数也是一个函数,它与其它函数是平行关系。
这一点是与其它语言不同的,应予以注意。
2. 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3. 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
如在例5.3 中,形参和实参的变量名都为n,是完全允许的。
4. 在复合语句中也可定义变量,其作用域只在复合语句范围内。
例如:main(){int s,a;……{int b;s=a+b;……b作用域}……s,a作用域}[例5.11]main(){int i=2,j=3,k;k=i+j;{int k=8;if(i==3) printf("%d\n",k);}printf("%d\n%d\n",i,k);}main(){k=i+j;{int k=8;if(i=3) printf("%d\n",k);}printf("%d\n%d\n",i,k);}本程序在main中定义了i,j,k三个变量,其中k未赋初值。
而在复合语句内又定义了一个变量k,并赋初值为8。
应该注意这两个k不是同一个变量。
在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。
因此程序第4行的k为main 所定义,其值应为5。
第7行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第9行输出i,k值。
i是在整个程序中有效的,第7行对i赋值为3,故以输出也为3。
而第9行已在复合语句之外,输出的k应为main所定义的k,此k值由第4 行已获得为5,故输出也为5。
二、全局变量全局变量也称为外部变量,它是在函数外部定义的变量。
它不属于哪一个函数,它属于一个源程序文件。
其作用域是整个源程序。
在函数中使用全局变量,一般应作全局变量说明。
只有在函数内经过说明的全局变量才能使用。
全局变量的说明符为extern。
但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
例如:int a,b; /*外部变量*/void f1() /*函数f1*/{……}float x,y; /*外部变量*/int fz() /*函数fz*/{……}main() /*主函数*/{……}/*全局变量x,y作用域全局变量a,b作用域*/从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。
但x,y 定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。
a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。
[例5.12]输入正方体的长宽高l,w,h。
求体积及三个面x*y,x*z,y*z的面积。
int vs( int a,int b,int c){int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;}main(){int v,l,w,h;printf("\ninput length,width and height\n");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d s1=%d s2=%d s3=%d\n",v,s1,s2,s3);}本程序中定义了三个外部变量s1,s2,s3,用来存放三个面积,其作用域为整个程序。
函数vs用来求正方体体积和三个面积,函数的返回值为体积v。
由主函数完成长宽高的输入及结果输出。
由于C语言规定函数返回值只有一个,当需要增加函数的返回数据时,用外部变量是一种很好的方式。
本例中,如不使用外部变量,在主函数中就不可能取得v,s1,s2,s3四个值。
而采用了外部变量,在函数vs中求得的s1,s2,s3值在main 中仍然有效。
因此外部变量是实现函数之间数据通讯的有效手段。
对于全局变量还有以下几点说明:1. 对于局部变量的定义和说明,可以不加区分。
而对于外部变量则不然,外部变量的定义和外部变量的说明并不是一回事。
外部变量定义必须在所有的函数之外,且只能定义一次。
其一般形式为:[extern] 类型说明符变量名,变量名… 其中方括号内的extern可以省去不写。
例如:int a,b;等效于:extern int a,b;而外部变量说明出现在要使用该外部变量的各个函数内,在整个程序内,可能出现多次,外部变量说明的一般形式为:extern 类型说明符变量名,变量名,…;外部变量在定义时就已分配了内存单元,外部变量定义可作初始赋值,外部变量说明不能再赋初始值,只是表明在函数内要使用某外部变量。
2. 外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,因而使得函数的独立性降低。
从模块化程序设计的观点来看这是不利的,因此在不必要时尽量不要使用全局变量。
3. 在同一源文件中,允许全局变量和局部变量同名。
在局部变量的作用域内,全局变量不起作用。
[例5.13]int vs(int l,int w){extern int h;int v;v=l*w*h;return v;}main(){extern int w,h;int l=5;printf("v=%d",vs(l,w));}int l=3,w=4,h=5;本例程序中,外部变量在最后定义,因此在前面函数中对要用的外部变量必须进行说明。
外部变量l,w和vs函数的形参l,w同名。
外部变量都作了初始赋值,mian函数中也对l作了初始化赋值。
执行程序时,在printf语句中调用vs函数,实参l的值应为main中定义的l值,等于5,外部变量l在main内不起作用;实参w的值为外部变量w的值为4,进入vs后这两个值传送给形参l,wvs函数中使用的h 为外部变量,其值为5,因此v的计算结果为100,返回主函数后输出。
变量的存储类型各种变量的作用域不同,就其本质来说是因变量的存储类型相同。
所谓存储类型是指变量占用内存空间的方式,也称为存储方式。
变量的存储方式可分为“静态存储”和“动态存储”两种。
静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。
5.5.1节中介绍的全局变量即属于此类存储方式。
动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。
典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。
如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。
从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。
生存期表示了变量存在的时间。
生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。
一个变量究竟属于哪一种存储方式,并不能仅从其作用域来判断,还应有明确的存储类型说明。
在C语言中,对变量的存储类型说明有以下四种:auto自动变量register 寄存器变量extern 外部变量static 静态变量自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。
在介绍了变量的存储类型之后,可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。
因此变量说明的完整形式应为:存储类型说明符数据类型说明符变量名,变量名…;例如:static int a,b; 说明a,b为静态类型变量auto char c1,c2; 说明c1,c2为自动字符变量static int a[5]={1,2,3,4,5}; 说明a为静整型数组extern int x,y; 说明x,y为外部整型变量。
总结与区别:变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
从作用域看:全局变量具有全局作用域。
全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。