python之名称空间知识点整理

命名空间的定义

python解释器在加载py文件时在内存中开辟的空间,该空间使用字典来存放对象与值。字典的键保存了py文件中的变量名、方法名、类名及其他环境变量名,对应的值保存了该对象的值(或内存地址或None)。

print(globals())

out:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020FF499EFD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'd:/Python/函数/关于函数的案例.py', '__cached__': None}

命名空间的分类

  1. 全局(Global names)名称空间

    python解释器开始加载py文件时创造的名称空间,存储的对象包括全局变量名、方法名、类名及其他环境变量。

    全局名称空间仅有一个。

  2. 局部(Local names)名称空间

    python解释器在方法、类等执行时才会创建的临时名称空间,存储的对象是该方法或类内部的变量名、方法名等。

    局部名称空间可以有多个,方法执行时创建结束后销毁。

    方法内可定义方法:外层方法->外层局部名称空间;内层方法->内层局部名称空间。

  3. 内置(Built-in names)名称空间

    python解释器用来保存内部模块builtins中的方法。

    内置名称空间仅有一个。

命名空间的加载顺序

  1. 内置(Built-in)名称空间
  2. 全局(global)名称空间
  3. 局部(local)名称空间

取值顺序->LEGB原则

调用对象时python会按如下顺序查找:

  1. 局部(local)名称空间
  2. 非本地(Enclosing)名称空间
  3. 全局(Global)名称空间
  4. 内置(Built-in)名称空间

经过以上四步未能找到该对象名字时就会报错。

在同一个名称空间下,名字和对象是一 一对应的。在不同名称空间下,一个名字可以存在三个对象:局部对象、非本地对象、全局对象,python会按照LEGB原则就近查找。

text = 123

def out():
    text = 456
    print('out',text)
    def inner():
        text = 789
        print('inner',text)
    inner()
out()
print(text)

out:
out 456
inner 789
123

关于Global和nonlocal

在内层方法中可以直接引用全局(Global)名称空间和非本地(Enclosing)名称空间中的对象。

text1 = '全局名称空间变量'
def out():
    text2 = '外层名称空间变量'
    def inner():
        print(text1)
        print(text2)
    inner()
out()

out:
全局名称空间变量
外层名称空间变量

在内层方法修改全局(Global)名称空间和非本地(Enclosing)名称空间中的对象会报错。

text1 = '全局名称空间变量'
def out():
    text2 = '外层名称空间变量'
    def inner():
# UnboundLocalError: local variable 'text1' referenced before assignment
        text1 += '在内层打印'

# UnboundLocalError: local variable 'text2' referenced before assignment
        text2 += '在内层打印'  
        print(text1)
        print(text2)
    inner()
out()

如果确实需要修改,必须先声明,然后才能修改。

text1 = '全局名称空间变量'
def out():
    text2 = '外层名称空间变量'
    def inner():
        global text1
        nonlocal text2
        text1 += '在内层修改'
        text2 += '在内层修改'
        print(text1)
        print(text2)
    inner()
out()

out:
全局名称空间变量在内层修改
外层名称空间变量在内层修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值