locals()和globals()

主要内容

  • __dict__
  • locals()
  • globals()
  • 内置名称空间
  • 有趣的问题

今天遇到一行这样的代码

locals().update(importlib.import_module("PARAMETERS").__dict__)

dict

以python的字典形式显示模块的所有属性( attribute ),接下来我们来用实验来见证“奇迹”:
模块:a.py

print("hello world")

def add(a, b):
    res = a+ b
    print("{} + {} = {}".format(a, b, res))
    return res

def subtract(a, b):
    res = a - b
    print("{} - {} = {}".format(a, b, res))
    return res

执行模块b.py

import a
print(a.__dict__)
print(a.add(3, 4))

结果

{'__name__': 'a', 'subtract': <function subtract at 0x7f2e9e138b70>, '__builtins__''add': <function add at 0x7f2e9e1d1bf8>, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f2e9e1440b8>, '__file__': '/home/fourye/PycharmProjects/Test/a.py'}

实验说明:
__dict__ 使用来显示模块的所有属性,以及属性的相关信息,也包括在属性在内存中的地址。

名称空间

在理解locals() 和 global() 这两个函数的时候,我们首先要理解python的名称空间,通过名称空间来搜索当前环境(局部或是全局)中的变量。而名称空间本质上就是一个字典。

locals()

每个函数都有自己的局部名称空间, 它记录了函数的参数和局部定义的变量,方法等。
实验胜于雄辩:

def mean(a, b):
    def sum(a, b):
        return a + b
    number = 2
    res = sum(a, b) / number
    print(locals())
    return res

mean(4, 6)

执行结果

{'b': 6, 'res': 5.0, 'sum': <function mean.<locals>.sum at 0x7f1018209158>, 'a': 4, 'number': 2}

globals()

在每个模块中都会记录这自己的的全局变量,其中包括函数,类,导入的模块,模块级别的变量和常量。
接下来我们就用实验擦亮你的“狗眼”:

def mean(a, b):
    def sum(a, b):
        return a + b
    number = 2
    res = sum(a, b) / number
    return res

class Hello(object):
    def __init__(self):
        print("class Hello")

    def hello(self):
        print("hello world")

a = 3

import os

print(globals())

实验结果:

{'__package__': None, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/fourye/PycharmProjects/Test/c.py', '__cached__': None, 'a': 3, 'os': <module 'os' from '/usr/lib/python3.4/os.py'>, '__spec__': None, '__name__': '__main__', 'Hello': <class '__main__.Hello'>, '__doc__': None, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f2774d204a8>, 'mean': <function mean at 0x7f2774d4bbf8>}

内置名称空间

任何模块都可以访问,它存放在内置的函数( builtinfunction )和异常( BuiltinException )。
这里写图片描述

内置异常

有趣的问题

在模块的globas() 和 locals() 会是怎么样?
咋办呢实验拜:

if globals() == locals():
    print("ha ha")

实验结果:

ha ha

那下面的怎么理解?

locals().update(importlib.import_module("PARAMETERS").__dict__)

答案:
实践吧,骚年

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值