您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

5b51 2022/1/14 8:24:57 python 字数 7258 阅读 793 来源 www.jb51.cc/python

本文说下自己对Python命名空间和作用域的理解。 注意:内容基于Python3.6 命名空间

概述

本文说下自己对 Python 命名空间和作用域的理解。

注意:内容基于 Python 3.6

A namespace is a mapping from names to objects.

命名空间,直译是名称到对象(比如数字、字符串等)的映射,(我的理解是)这些名称构成一个命名空间。一般有三种命名空间

看个例子就清楚了

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

命名空间的生命周期各不相同

A scope is a textual region of a Python program where a namespace is directly accessible. “Directly accessible” here means that an unqualified reference to a name attempts to find the name in the namespace.

作用域,是 Python 代码中的一段文本区域,在这个区域里能「直接」访问一个命名空间中的名称。所谓「直接」,就是只要给出名称(如 some_name)就能找到命名空间中的对应的名称,而不需要使用类似 modulename.subname 或是 object.attribute 等这样的方式。

有四种作用域:

其中,需要强调的是 local scope 和 nonlocal scope 是一个相对的概念。如果一个模块中,函数 A 直接包含了函数 B , B 又直接包含了函数 C 。如果以 C 中的名称作为参考,那么 C 中的作用域为 local scope,则 B 中的作用域就为 nonlocal scope。如果以 B 中的名称作为参考,那么 B 中的作用域是 local scope, 则 A 中的作用域为 nonlocal。如果以 A 中的名称作为参考,那么 A 中的作用域是 local scope,不过要注意,模块中的作用域始终为 global scope,这时并没有 nonlocal scope。

对于赋值操作,认都是操作当前作用域中包含的名称。假设现在在 local scope,如果要对 nonlocal scope 包含的名称进行赋值,则要用 nonlocal 关键字。如果要对 global scope 中包含的名称赋值要用 global 关键字。需要注意的是,如果在某个作用域内没有对应的名称,则在对应的作用域中会新增。 下面的例子可以帮你理解赋值操作

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

输出

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

对应读值操作,都是由内到外进行搜索。即 local scope -> nonlocal scope -> global scope -> builtin scope,如果都找不到对应的名称,则报错。

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

如果要读取指定作用域的名称,则可以使用对应的 nonlocal 或 global 关键字,如果对应作用域找不到该名称,则直接报错。

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

Python 命名空间和作用域!偏冷门的知识点,你知道吗?

当然,如果当前作用域已有同名的名称,就不能使用这 nonlocal 或 global 了,否则会报错。

一个报的是语法错误,而第二个是运行时报的错误。这说明了一个问题:局部名称的查找是编译时就确定的,而全局名称和内置名称的查找都是在运行时确定的。(这里只是指出来,了解下就行,暂时没必要深入)

个人觉得,没必要太在意命名空间和作用域的定义,之所以有命名空间的说法,只是为了引入作用域的概念。

我们只需要清楚两个方面的内容:一是,哪个作用域包含哪些名称;二是,相反的,赋值和读值的时候它又是指向哪个作用域,并理解 nonlocal 和 global 的使用。

总结

以上是编程之家为你收集整理的Python 命名空间和作用域!偏冷门的知识点,你知道吗?全部内容,希望文章能够帮你解决Python 命名空间和作用域!偏冷门的知识点,你知道吗?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶