【IT专家】Python老男孩 day14 函数(二) 局部变量与全局变量
- 格式:pdf
- 大小:211.79 KB
- 文档页数:3
全局变量与局部变量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形式)。
Python全局变量与局部变量区别及⽤法分析本⽂实例讲述了Python全局变量与局部变量区别及⽤法。
分享给⼤家供⼤家参考,具体如下:对于很多初学的同学,对全局和局部变量容易混淆,看看下⾯给⼤家的讲解相信都应该明⽩两者的区别了。
定义:全局变量:在模块内、在所有函数的外⾯、在class外⾯局部变量:在函数内、在class的⽅法内下⾯来看看例⼦⼀、函数内部调⽤全局变量a="hello" #全局变量adef test():global a#调⽤全局变量ab =a #test⽅法⾥之后再调⽤a时,都是全局的aprint(b,a)test()在test函数⾥调⽤全局变量a,看看运⾏后的结果('hello', 'hello')运⾏后都是全局变量的值hello⼆、函数内部使⽤与全局变量同名的局部变量a="hello" #全局变量adef test():a="hell0 local" #定义了⼀个局部变量ab =a #test⽅法⾥之后再调⽤a时,都是局部的aprint(b+",",a)test()这⾥在函数test⾥⾯再定义了⼀个a,这个a就为局部变量了,之后在test⾥调⽤的a全都是局部的a。
看看运⾏结果:('hell0 local,', 'hell0 local')三、函数内部修改全局变量值a="hello" #全局变量adef test():global aa="hell0 global" #修改全局变量a的值b =a #test⽅法之⾥后再调⽤a时,都是全局的aprint(b+",",a)test()在函数test⾥⾯先声明⽤的是全局的a,然后对a进⾏修改,就等于是修改了全局变量a的值。
看看运⾏结果:('hell0 global,', 'hell0 global')注:在⽅法内部的变量是在=号前⾯的,那肯定是局部变量。
python线程中的全局变量与局部变量在python多线程开发中,全局变量是多个线程共享的数据,局部变量是各⾃线程的,⾮共享的。
如下⼏种写法都是可以的:第⼀种:将列表当成参数传递给线程from threading import Threadimport timedef work1(nums):nums.append(44)print("----in work1---",nums)def work2(nums):#延时⼀会,保证t1线程中的事情做完time.sleep(1)print("----in work2---",nums)if__name__=='__main__':g_nums = [11, 22, 33]t1 = Thread(target=work1, args=(g_nums,)) #这种写法是将列表当成参数传递t1.start()t2 = Thread(target=work2, args=(g_nums,))t2.start()第⼆种:不传递,直接⽤from threading import Threadimport timedef work1():nums.append(44)print("----in work1---",nums)def work2():#延时⼀会,保证t1线程中的事情做完time.sleep(1)print("----in work2---",nums)if__name__=='__main__':nums = [11, 22, 33]t1 = Thread(target=work1)t1.start()t2 = Thread(target=work2)t2.start()结果都⼀样:对于参数是字符串,数字这种不可变类型的变量,改变变量的值的时候,要⽤上global,否则程序报错。
Python基础笔记系列九:变量、⾃定义函数以及局部变量和全局变量 本系列教程供个⼈学习笔记使⽤,如果您要浏览可能需要其它编程语⾔基础(如C语⾔),why?因为我写得烂啊,只有我⾃⼰看得懂!!变量在前⾯的系列中也许就可以发现,python中的变量和C中的变量有些许不同。
⽐如在C中:例⼦:1 #include <stdio.h>23int main(void)4 {5/* code */6int a,b,c;7int *p,*q,*t;89 a = 5,b=8,c=5;10 p = &a;11 q = &b;12 t = &c;13 printf("%d\n",p);14 printf("%d\n",q);15 printf("%d\n",t);16return0;17 }输出:164876042648760036487596 从输出结果可以看出,虽然a和c的值是⼀样的,但是a和c的地址是不同的。
也就是说a开始赋值为5开辟了⼀块空间,当c赋值为5时⼜会给它分配⼀块空间。
但是在python 中就不同,如下的例⼦。
例⼦:1#----------变量--------2 a = 53 b = 84 c = 55print id(a) #id(变量名) ⽤于取变量的地址6print id(b)7print id(c)输出:1 869955522 869955163 86995552从上⾯两个例⼦中我们可以看出区别: 1)c语⾔中定义变量需要定义变量类型,具体这个变量是int、long还是char等等,⽽python中不关⼼变量的类型,直接定义变量,它会⾃⼰寻找最合适的类型进⾏存储,可通过type(变量名)来查看变量的类型,在前⾯的系列中也可以看出python的变量没有类型,⽐如定义⼀个字符串str则可以直接:str = "hello"。
Python语法基础——关于全局变量与局部变量1、函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,函数中使用的将是局部变量,例如:num = 100def func():num = 123print(num)func()输出:123说明函数中定义的num是一个局部变量,会将全局变量覆盖。
再例如:num = 100def func():num += 100print(num)func()输出:UnboundLocalError: local variable 'num' referenced before assignment错误提示局部变量num在赋值前被应用,也就是该变量没有定义就使用它,由此再次证明了这里定义了一个局部变量,而不是使用的全局的num。
总结:函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量。
Python makes educated guesses on whether variables are local or global. It assumes that any variable assigned a value in a function is local.2、函数内部的变量名如果第一次出现,且出现在=后面,且该变量在全局域中已定义,则这里将引用全局变量,如果该变量在全局域中没有定义,当然会出现“变量未定义”的错误。
例如:num = 100def func():x = num + 100print(x)func()输出:200表示这里使用的num是全局变量num。
或者其他使用该变量(例如调用成员函数)的情况,也将引用全局变量,例如:a = [1, 2]def func():a.append(3)print(a)func()输出:[1, 2, 3]总结:只要是*使用*变量,而该变量在全局域中有定义,而在局部没有定义,则会使用全局变量。
python中全局变量和局部变量1、python中定义在函数内部的变量称为局部变量,局部变量只能在局部函数内部⽣效,它不能在函数外部被引⽤。
def discount(price,rate):price_discounted = price * ratereturn price_discountedsale_price = float(input("please input the sale_price:"))discount_rate = float(input("please input the discount_rate:"))sell_price = discount(sale_price,discount_rate)print("sell_price is: %.3f" % sell_price)## 在以上脚本中,定义函数discount(),两个形参price和rate。
局部变量为 price、rate 和 price_discounted. 全局变量为 sale_price、discount_rate和 sell_price。
运⾏效果如下:please input the sale_price:800please input the discount_rate:0.5sell_price is: 400.000a、尝试在函数外部访问全局变量和局部变量,全局变量可以访问,局部变量不可以访问>>> sale_price ## 全局变量800.0>>> discount_rate ## 全局变量0.5>>> sell_price ## 全局变量400.0>>> price ## 局部变量Traceback (most recent call last):File "<pyshell#45>", line 1, in <module>priceNameError: name 'price'is not defined>>> rate ## 局部变量Traceback (most recent call last):File "<pyshell#46>", line 1, in <module>rateNameError: name 'rate'is not defined>>> price_discounted ## 局部变量Traceback (most recent call last):File "<pyshell#47>", line 1, in <module>price_discountedNameError: name 'price_discounted'is not definedb、尝试在函数内部访问全局变量def discount(price,rate):price_discounted = price * rateprint("output globle varable sale_price:",sale_price)return price_discountedsale_price = float(input("please input the sale_price:"))discount_rate = float(input("please input the discount_rate:"))sell_price = discount(sale_price,discount_rate)print("sell_price is: %.3f" % sell_price)please input the sale_price:800please input the discount_rate:0.5output globle varable sale_price: 800.0 ##在函数内部可以访问全局变量sell_price is: 400.000c、尝试在函数内部修改全局变量def discount(price,rate):price_discounted = price * ratesale_price = 5000 ## 在函数内部修改全局变量print("new_sale_price:",sale_price) ## 在函数内部输出修改后的变量return price_discountedsale_price = float(input("please input the sale_price:"))discount_rate = float(input("please input the discount_rate:"))sell_price = discount(sale_price,discount_rate)print("sell_price is: %.3f" % sell_price)print("output the varable sale_price:",sale_price) ## 在函数外输出修改后的变量,验证是否改变please input the sale_price:800please input the discount_rate:0.5new_sale_price: 5000 ## 在函数内部返回修改后的变量sell_price is: 400.000output the varable sale_price: 800.0 ## 在函数外部返回原始变量## 在函数内部可以访问全局变量,但是不可以修改全局变量局部变量只能在函数内调⽤,不能够在函数外调⽤;全局变量可以在函数内访问,全局变量不可以在函数内修改。
第⼗⼆篇Python函数之全局变量局部变量递归函数全局变量:在定义的时候,顶头写的,没有任何缩进的变量就是全局变量。
全局变量的特点:在当前⽂件⾥的任何地⽅都可以进⾏调⽤局部变量:在⼦程序⾥定义的变量,就是局部变量。
⼦程序:⽐如.py⽂件⾥,写的函数就是个⼦程序。
⽽这个函数⾥定义的变量就是局部变量⽰例:全局变量# 全局变量name='alex'def change_name():print('change_name',name) # 调⽤了全局变量change_name()# 结果change_name alexprint(name) #调的是全局变量# 结果alex⽰例:函数体内定义局部变量# 全局变量:全局作⽤域name='alex'def change_name():name='帅呆了'# 局部变量:局部作⽤域print('change_name',name) # 先在⾃⼰的⼦程序⾥找,调⽤了局部变量# 举个⽣活中的例⼦,刚起床找⼿机,肯定现在⾃⼰卧室(函数)找,⾃⼰卧室找不到,才可能会到卧室(函数之外)之外去找。
# 所以,很好的理解,就是优先内部,然后外部;局部变量只能该函数⾃⼰使⽤(私⼼重),全局变量就⽐较⼤⽅,谁需要就可以拿去⽤change_name()# 结果change_name 帅呆了print(name) #调的是全局变量# 结果alex⽰例:函数体内声明全局变量# 全局变量name='alex'def change_name():global name # 函数体内声明了全局变量name='帅呆了'# 函数体内修改了全局变量的值print('change_name',name) # 调⽤了全局变量change_name()# 结果change_name 帅呆了print(name) #调的是全局变量,但是全局变量的值已经被修改# 结果帅呆了更好的⽰例如果函数的内容⽆global关键字,优先读取局部变量;如果没有局部变量,只能读取全局变量,⽆法对全局变量重新赋值,但于可变类型,是可以对内部元素进⾏操作如果函数的内容有global关键字,函数内的变量就是全⾯局变量,可以读取,可以赋值name = "桃花李"def yangjian():global name # 已经声明,NAME就是全局的的那个变量print('我要', name)print('我要搞', name)yangjian()qupengfei()#结果我要桃花李我要⼩东北我要搞基总结全局变量变量名⼤写局部变量变量名⼩写下⾯的⽰例为了说明全局变量和局部变量的关系,都⽤的是⼤写。
局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。
Python的全局变量和局部变量局部变量:定义在函数内部的变量称为局部变量,他的作⽤域范围为函数内,也就是出了函数外就⽆效。
举个简单的例⼦:葫芦娃在国内基本⼤家都认识他,⼤家⼀看到他就会知道,咦,那是葫芦娃。
但是⼀旦出了国外,就没有⼈认识他了,葫芦娃的作⽤域范围为国内。
全局变量:定义在函数外的变量称之为全局变量,他的作⽤域范围为全局。
再举个例⼦:如果把函数⽐作国家,那么全局就是全球,全局变量就像是阿拉伯数字,你去到哪,⼤家都认识。
由上⾯的定义可以看出,所谓的全局变量跟局部变量主要是针对函数内外⽽⾔的。
我们接下来举个简单的例⼦说明全局变量跟局部变量在实际应⽤中的区别:a = "python" # 函数外定义的a为全局变量def func1():print (a)def func2():b = "⼩⿊屋" # 函数内定义的b为局部变量print (b)func1() # 执⾏函数func1func2() # 执⾏函数func2print(b) # 输出函数func2中的局部变量b>>python # 函数func1执⾏后输出全局变量a>>⼩⿊屋 # 函数func2执⾏后输出局部变量b# 在函数外输出局部变量b,出现了未定义的报错Traceback (most recent call last):File "<pyshell#11>", line 1, in <module>print(b)NameError: name 'b' is not defined由上⾯的例⼦可以看出,局部变量只能在函数内部使⽤,⽽全局变量是全局范围内都能引⽤。
但如果在函数内定义了⼀个跟全局变量⼀样名字的变量,这时候会怎样呢?请看例⼦:a = "python"def func1():a = '⼩⿊屋'print (a)def func2():print(a)func1()func2()print (a)>>⼩⿊屋>>python>>python由上可知,当你在函数内定义⼀个与全局变量⼀样名字的变量时,相当于你在函数内重新定义了⼀个局部变量,为什么这样说呢,因为你会发现,你在函数内重新定义这个变量后,⽆论你在函数内怎样改动这个函数的值,只有在函数内⽣效,对全局来说是没有任何影响的。
关于python 的全局变量与局部变量#情况1CONSTANT = 0 #(1)def modifyConstant() :CONSTANT=10 #(2)print CONSTANT, #(3)CONSTANT += 1 #(4)returnif __name__ == '__main__' :modifyConstant()print CONSTANT #(5)此时,(1)和(5)中的CONSTANT为全局变量,(2)、(3)、(4)中的为局部变量打印结果为10 0#情况2CONSTANT = 0 #(1)def modifyConstant() :print CONSTANT, #(2)CONSTANT += 1 #(3)returnif __name__ == '__main__' :modifyConstant()print CONSTANT #(4)在新函数(modifyConstant)中CONSTANT被重新赋值的情况下,CONSTANT被认为是该函数中的局部变量。
所以(1)和(4)中的是全局变量,(2)和(3)中是局部变量。
既然这样,modifyConstant函数中的CONSTANT在被打印的时候就是一个未被赋值的变量,所以出错。
此种错误类型与下面代码同类:def main():print aa=10#情况3CONSTANT = 0 #(1)def modifyConstant() :global CONSTANT # (2)CONSTANT=10 #(3)print CONSTANT, #(4)CONSTANT += 1 #(5)returnif __name__ == '__main__' :modifyConstant()print CONSTANT #(6)打印结果:10 11此时所有的CONSTANT都是全局变量,所以要想在某个函数内引用全局变量并且需要改变其值,应该在该函数内用global声明【情况3所示】。
本文由我司收集整编,推荐下载,如有疑问,请与我司联系Python老男孩day14 函数(二)局部变量与全局变量2018/05/28 4 https://cnblogs/linhaifeng/articles/6113086.html ——————————————————————————————————————
五、局部变量与全局变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
name=‘lhf’def change_name(): print(‘我的名字’,name)change_name() 运行结果:我的名字lhf
def change_name(): name=‘帅了一笔’ print(‘我的名字’,name)change_name()print(name) 运行结果:我的名字帅了一笔lhf
def change_name(): global name name=‘帅了一笔’ print(‘我的名字’,name)change_name()print(name) 运行结果:我的名字帅了一笔帅了一笔
NAME = “产品经理”def yangjian(): global NAME # 已经声明,NAME就是全局的的那个变量print(‘我要搞’, NAME) NAME = “小东北” # 修改全局的变量print(‘我要搞’, NAME)yangjian()
运行结果:
我要搞产品经理我要搞小东北
#如果函数的内容无global关键字-有声明局部变量
NAME = [“产品经理”,”廖波湿”]def qupengfei(): NAME = “自己” print(‘我要搞’, NAME)qupengfei() 运行结果:我要搞自己
-无声明局部变量
NAME = [“产品经理”, “廖波湿”]def qupengfei(): NAME.append(‘XXOO’) print(‘我要搞’, NAME)qupengfei()。