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

时间:2019-08-30 19:31:30

标签: python python-3.x python-import

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

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

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

我了解我们可以使用foll导入。方法:

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

我知道在上述每个模块中,整个模块都已加载到sys模块词典中。但是我对命名空间,范​​围,全局,本地感到困惑。我想了解LEGB的原理,名称空间,全局,本地,相对于导入方法还是从导入方法而言。我已经读到,在第1点(import modulename)的情况下,模块名已加载到其自己的名称空间中,并且调用模块可以使用该引用来全局更改变量值。这是否也意味着它在全局名称空间中?如果是这样的话,那么全球性的呢?另外,我已经读到from module import function/variablefrom 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的比较。但是他们没有解释为什么所做的更改/如何使更改成为全局(如果是导入)相对于本地(如果是从导入)。

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

module1.py:

a = 10 main.py:

从module1导入一个 打印(a) a = 100 而如果我们使用import module1而不是从module1 import a进行导入,则该分配将更改module1.py中的a值,而任何随后的module1.py导入都将a的值显示为100。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

每个内容不变的变量,其值可以是全局的

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

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