python中的作用域
作用域
先谈谈python中的全局变量和局部变量
一,全局量和局部变量
全局变量,所有的作用域都可读。而在定义的def函数内部的变量则属于局部变量,只
对该函数生效,如果想在自定义的函数中修改全局变量,需要:global name ,然后再定义
即可对全局变量重新赋值。但是对于像列表、字典、嵌套有列表的元组这样的全局变量,
在不使用global的情况下,自定义的函数中全局变量可修改但是不可重新赋值(意思是重
新赋值只会在当前函数中生效,而修改则会在接下来所有的函数中生效,相当于修改了全
局变量)。
1,一定注意在定义全局变量的时候,一定要大写。如,NAME = 'tom'等。
NAME = 'tom' def f1(): age = 19 global NAME NAME = 'yn' print(NAME, age) def f2(): age = 18 print(NAME,age) f1() f2()
执行结果:
yn, 19
yn, 18
2,
NAME = [ 'tom','lucy'] def f1(): age = 19 # global NAME NAME.append('yn') #修改会在接下来的函数中也生效,成为全局变量 print(NAME, age) def f2(): age = 18 print(NAME,age) f1() f2()
执行结果:
['tom', 'lucy', 'yn'] 19
['tom', 'lucy', 'yn'] 18
二, 块级作用域
python javascripts中无块级作用域(块级作用域是指if...else...中)
java C#中有块级作用域
1, 所以下面这段代码在python和javascripts中有执行结果,在java和C#中则没有
if 1 == 1: name = "tom" print(name)
2, python作用域链,由内向外找,直到找不到报错!
name = "tom" def f1(): name = "a" def f2(): name = 'b' print(name) f2() f1()
执行结果:
b
3, 易混淆的点
name = "tom" def f1(): print(name) def f2(): name = 'lucy' f1() f2()
执行结果:
tom
4,易混淆的点
name = "tom" def f1(): print(name) def f2(): name = "lucy" return f1 ret = f2() ret()
执行结果:
tom
总结:
python中,在函数未执行之前,作用域已经确定了,作用域链也已经确定了。
作用域跟函数放在哪执行没有关系,无论在哪执行函数都要去原函数所在的作用域由内向外去找。
拥抱不确定,未来可期!喜欢该文章请不吝点赞推荐,如有疑问欢迎留言,我们一起探讨。