繁体   English   中英

关于导入的全局名称空间,局部名称空间的概念

[英]Concept of namespace, global, local with respect to import

我了解以下是python中的作用域级别(以从高到低的顺序列出)

  • Local(L):在函数/类内部定义
  • 封闭(E):定义在封闭函数内部(嵌套函数概念)
  • 全局(G):在最高层定义
  • 内置(B):Python内置模块中的保留名称

当我们只有一个文件时,我了解这个概念。 我试图了解在python中使用import时,名称空间,局部,封闭,全局,内置的概念如何工作。

我了解我们可以使用foll导入。 处理办法:

  1. 导入模块名称
  2. 导入模块名。功能(功能/变量)
  3. 导入package.module.function(函数/变量)
  4. 来自模块导入功能(功能/变量)
  5. 从包导入模块
  6. 从package.module导入函数(函数/变量)
  7. 从模块导入*
  8. 从包裹进口*

我知道在上述每个模块中,整个模块都已加载到sys模块词典中。 但是我对命名空间,范​​围,全局,本地感到困惑。 我想了解LEGB的原理,名称空间,全局,本地,相对于导入方法还是从导入方法而言。 我已经阅读到在点1( import modulename )的情况下,modulename加载在其自己的名称空间中,并且调用模块可以使用该引用来全局更改变量值。 这是否也意味着它在全局名称空间中? 如果是这样的话,那么全球性的呢? 我还from module import function/variablefrom module import *读取了from module import *在调用模块名称空间中引入了函数/变量,并且所有更改都不是全局的。 这是否意味着它在本地名称空间中? 本地方面呢?

示例:假设模块foo的变量bar = 10。 当我们使用[import foo]时-这会将foo带入当前名称空间,并允许我们通过foo.bar = 1000更改bar的值,并且此更改对于使用[import foo print(foo。完成上述分配后)。 与[from foo import bar]的情况一样,对bar所做的任何更改仅对该模块可见,而对其他模块不可见,无论它们是执行[import foo]还是[from foo import bar],它们都将看到酒吧为10。

该领域的任何参考/链接将非常有帮助。 我想了解其内部工作原理。 任何信息将有助于您理解这一点。 我在该主题上找到的文章解释了什么是导入与来自xx import yy的比较。 但是他们没有说明所做更改为何/如何成为全局更改(对于导入)或本地更改(对于来自导入)。

还有更多示例:在下面的代码示例中,仅在main.py文件中看到对a所做的更改,并且不会影响module1.py中a的值,并且导入module1.py的后续模块仍将看到a的值。 10。

module1.py:

a = 10 main.py:

从module1导入print(a)a = 100而如果我们使用import module1而不是from module1 import a,则该赋值将更改module1.py中a的值,并且随后的module1.py导入将显示a的值为100。

注意:类似地,我们也可以在module.py中使用函数来获取和设置变量'a'的值。 并使用这种方法,一旦我们在main.py中执行了“从module1 import getfn,setfn从导入”,我们就可以使用这些函数,这些函数在被调用时对变量“ a”进行更改,并且此更改在全局范围内可见。

您已经使事情变得复杂了。 从导入的角度来看,唯一要知道的是import foo将foo带入当前名称空间,而from foo import bar将bar带入当前名称空间。

Python只有3个范围:全局本地和内置。
它们相对于代码中的位置

您可以更改其值的每个变量都是局部变量
(请注意,更改全局变量会导致创建新的局部变量,
因此存在相同名称的局部变量和全局变量)
随函附上的内容仅限于该功能

内容不变的每个变量都可以获取其值

内置变量与全局变量完全一样,因此甚至可以认为它们是全局变量

要查看哪些变量是全局变量,什么是局部变量,请将此行放入代码中
print("global:", globals(), "\\n\\nlocal:", locals())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM