Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于导入的名称空间、全局和局部概念_Python_Python 3.x_Python Import - Fatal编程技术网

Python 关于导入的名称空间、全局和局部概念

Python 关于导入的名称空间、全局和局部概念,python,python-3.x,python-import,Python,Python 3.x,Python Import,我知道下面是python中的作用域级别(按从高到低的顺序列出) 局部(L):在函数/类内部定义 封闭(E):在封闭函数内定义(嵌套函数概念) 全局(G):在最高级别定义 内置(B):Python内置模块中的保留名称 当我们只有一个文件时,我理解这个概念。我试图理解在python中使用import时,名称空间、本地、封闭、全局和内置的概念是如何工作的 我知道我们可以用foll进口。方法: 导入模块名 导入modulename.function(函数/变量) 导入包.module.functio

我知道下面是python中的作用域级别(按从高到低的顺序列出)

  • 局部(L):在函数/类内部定义
  • 封闭(E):在封闭函数内定义(嵌套函数概念)
  • 全局(G):在最高级别定义
  • 内置(B):Python内置模块中的保留名称
当我们只有一个文件时,我理解这个概念。我试图理解在python中使用
import
时,名称空间、本地、封闭、全局和内置的概念是如何工作的

我知道我们可以用foll进口。方法:

  • 导入模块名
  • 导入modulename.function(函数/变量)
  • 导入包.module.function(函数/变量)
  • 从模块导入函数(函数/变量)
  • 从包导入模块
  • 从package.module导入函数(函数/变量)
  • 从模块导入*
  • 从包装进口*
  • 我知道在上面的每个模块中,整个模块都加载到sys modules字典中。但我对名称空间、范围、全局和局部感到困惑。我想了解LEGB原则、名称空间、全局、本地以及import与from import的方法。我已经了解到,在第1点(
    import modulename
    )的情况下,modulename被加载到它自己的名称空间中,调用模块可以使用引用全局更改变量值。这是否也意味着它位于全局命名空间中?如果有的话,那么全球关于什么?我还了解到,模块导入函数/变量中的
    或模块导入中的
    将函数/变量带到调用模块命名空间中,任何更改都不是全局性的。这是否意味着它位于本地名称空间中?本地的关于什么

    例如: 假设模块foo有一个变量bar=10。当我们使用[import foo]-这将foo引入当前名称空间,并允许我们通过foo.bar=1000更改bar的值,并且在进行上述分配后,使用[import foo print(foo.bar)]的每段代码都可以看到此更改。其中,与[from foo import bar]的情况一样,对bar所做的任何更改仅对该模块可见,而对任何其他模块都不可见,无论他们是执行[import foo]还是[from foo import bar],他们都会将bar的值视为10

    这方面的任何参考/链接都将非常有用。我想了解内部工作原理的基本知识。任何信息都有助于理解这一点。我在这个主题上找到的文章解释了什么是导入vs从xx导入yy。但他们没有解释为什么/如何使更改变成全局(在导入的情况下)而不是本地(在从导入的情况下)

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

    模块1.py:

    a=10 main.py:

    从模块1导入a 印刷品(a) a=100 然而,如果我们使用import module1而不是module1 import a,那么赋值将改变module1.py中a的值,并且module1.py的任何后续导入将显示a的值为100


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

    你把事情复杂化了。从导入的角度来看,唯一需要知道的是,
    import foo
    将foo引入当前名称空间,
    From foo import bar
    将bar引入当前名称空间。

    Python只有3个作用域:全局本地和内置。
    它们与代码中的位置相关

    您可以更改其值的每个变量都是局部变量
    (请注意,更改全局变量会导致创建新的局部变量,
    因此有相同名称的局部变量和全局变量)
    您提到的附件是该功能的本地版本

    每个具有不可更改内容的变量的值都是全局的

    内置变量与全局变量完全相同,因此它们甚至可以被视为全局变量

    要查看哪些变量是全局变量,哪些变量是局部变量,请将这一行放在代码中

    print(“global:,globals(),”\n\nlocal:,locals())

    在您的示例中,假设foo有一个变量bar=10。当我们使用[import foo]时——正如您所说,这将foo引入当前名称空间,并允许我们通过foo.bar更改bar的值,并且在完成上述分配后,使用[import foo print(foo.bar)]的每一段代码都可以看到此更改。其中,与[from foo import bar]的情况一样,对bar所做的任何更改仅对该模块可见,而对任何其他模块都不可见,无论它们是执行[import foo]还是[from foo import bar]。所以我想从这个上下文中理解,但这与Python中的其他内容完全相同。如果您有一个类实例
    foo
    ,然后执行
    foo.bar=1
    ,那么对
    foo
    的任何其他引用也将看到新属性;然而,如果重新指定foo-like
    foo=1
    ,那么这只会影响它在本地命名空间中绑定到的内容。这就是名称在Python中的工作方式,对于导入或模块没有什么特别之处。您可能应该阅读这篇有用的文章:您能给我指一篇解释名称空间生命周期的文章吗(从“导入”/“从导入”的角度)-我的混淆是因为-使用modulename import fn/var中的-a)“import modulename”和b)“这两种方法都可以运行整个模块代码,但在仅调用方的方法中,“a”会引用被调用的模块名称空间。哪里