Python进阶02 作用域

一、作用域

作用域针对变量而言,指申明了变量在程序里的可应用范围。

只有函数,类,模块会产生作用域,代码块不会产生作用域。例如for循环,if判断都不产生作用域。

 

二、作用域链

Python中作用域链,变量会由内到外去找,先去自己的作用域找,自己没有在去上级去找,一直到找不到报错。

特性:函数未执行之前,作用域已经形成,作用域链也生成了。

name = "lzl"
 
def f1():
    print(name)
 
def f2():
    name = "eric"
    f1()
f2()
结果:
lzl

这里有解释:

在f2中执行f1时,f1的作用域链已经形成,向上级找,name为lzl。

 

三、全局变量和局部变量

全局变量:所有函数之外定义的变量。

局部变量:函数内部定义的变量或者类,模块里的变量。

 

函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。

(即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。)

a = 10
b = 20
 
def fun():
 
    a = 1
    b = 10
    print('locals: ', locals())

fun()
print('globals: ', globals())

结果:
locals:  {'a': 1, 'b': 10}
globals:  {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a2f0080>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Volumes/DATA/python/python_test/test.py', '__cached__': None, 'a': 10, 'b': 20, 'fun': <function fun at 0x10a283268>}

 

四、在函数中使用全局变量(务必慎用全局变量)

如果只是读取全局变量不会有任何问题。

如果想重新关联全局变量,则需要借助关键字global。

_num = 100

def func():
    global _num  # 声明这个Num是全局。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。
    _num = 200
    print(_num)

func()
print(_num)  # 输出200 说明修改的就是全局变量

 

参考文章:

https://www.cnblogs.com/goldsunshine/p/10948475.html

 

posted on 2020-03-18 13:58  麦克煎蛋  阅读(245)  评论(0编辑  收藏  举报