以下为知识DOC为大家进行整理的相关内容,希望对大家有所帮助!
命名空间的定义
解释器在加载py文件时在内存中开辟的空间空间名称,该空间使用字典来存放对象与值。字典的键保存了py文件中的变量名、方法名、类名及其他环境变量名,对应的值保存了该对象的值(或内存地址或None)。
print(globals())out:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'd:/Python/函数/关于函数的案例.py', '__cached__': None}
命名空间的分类全局( names)名称空间:局部(Local names)名称空间:内置(Built-in names)名称空间:命名空间的加载顺序内置(Built-in)名称空间全局()名称空间局部(local)名称空间取值顺序->LEGB原则
调用对象时会按如下顺序查找:
局部(local)名称空间非本地()名称空间全局()名称空间内置(Built-in)名称空间
经过以上四步未能找到该对象名字时就会报错。
在同一个名称空间下,名字和对象是一 一对应的。在不同名称空间下,一个名字可以存在三个对象:局部对象、非本地对象、全局对象,会按照LEGB原则就近查找。
text = 123def out(): text = 456 print('out',text) def inner(): text = 789 print('inner',text) inner()out()print(text)out:out 456inner 789123
关于和
在内层方法中可以直接引用全局()名称空间和非本地()名称空间中的对象。
text1 = '全局名称空间变量'def out(): text2 = '外层名称空间变量' def inner(): print(text1) print(text2) inner()out()out:全局名称空间变量外层名称空间变量
在内层方法修改全局()名称空间和非本地()名称空间中的对象会报错。
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 += '在内层修改' global text3 text3='方法内创建的全局变量' print(text1) print(text2) inner()out()print(text3)out:全局名称空间变量在内层修改外层名称空间变量在内层修改方法内创建的全局变量
本文地址: https://www.zhishidoc.com/33226.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 859089669@qq.com 举报,一经查实,本站将立刻删除。