python的作用域、globals()-全局变量 和 locals()-局部变量

目录

查看全局变量和局部变量

变量解析规则

变量生存周期


在python中,函数会创建一个自己的作用域,也称为为命名空间。当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找。

我们自己定义的全局变量均在python内建的globals()函数中,以字典的形式保存。而locals()函数返回的是函数内部本地作用域中的变量名称字典。

查看全局变量和局部变量

a = 1


def b():
    e = 2
    print(locals())
    
    
class C:
    def __init__(self):
        pass
    
    
print(globals())
b()

输出结果

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005055C0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/qqq.py', '__cached__': None, 'a': 1, 'b': <function b at 0x00000000004BC1E0>, 'C': <class '__main__.C'>}
{'e': 2}

由此可以看出,函数都有各自独立的命名空间。

通过全局变量,可以知道内置属性__file__指的是当前运行的文件名称,__name__指的是__main__。

变量解析规则

在python的作用域规则里面,创建变量时一定会在当前作用域里创建同样的变量,但访问或修改变量时,会在当前作用域中查找该变量,如果没找到匹配的变量,就会依次向上在闭合作用域中进行查找,所以在函数中直接访问全局变量也是可以的。

 但是变量在调用之前必须被声明,否则报错。

var = "this is a global variable"


def test():
    print("在test函数内调用var:" + var)


test()
print(a)

输出结果

在test函数内调用var:this is a global variable
Traceback (most recent call last):
  File "D:/yibo/_git/study-notes/qqq.py", line 9, in <module>
    print(a)
NameError: name 'a' is not defined

需要注意的是我们在调用print()函数时,并没有定义这个函数,为什么没有报错?

这是因为,如果在全局变量中没有找到函数的变量时,还会去“__builtins__”对应的作用域去查找,我们常用的Python内建函数均放在这个作用域中。

print(globals()["__builtins__"].__dict__)

输出结果

{'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': ModuleSpec(name='builtins', loader=<class 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值