Python 关于导入的名称空间、全局和局部概念
我知道下面是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
- 局部(L):在函数/类内部定义
- 封闭(E):在封闭函数内定义(嵌套函数概念)
- 全局(G):在最高级别定义
- 内置(B):Python内置模块中的保留名称
import
时,名称空间、本地、封闭、全局和内置的概念是如何工作的
我知道我们可以用foll进口。方法:
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-likefoo=1
,那么这只会影响它在本地命名空间中绑定到的内容。这就是名称在Python中的工作方式,对于导入或模块没有什么特别之处。您可能应该阅读这篇有用的文章:您能给我指一篇解释名称空间生命周期的文章吗(从“导入”/“从导入”的角度)-我的混淆是因为-使用modulename import fn/var中的-a)“import modulename”和b)“这两种方法都可以运行整个模块代码,但在仅调用方的方法中,“a”会引用被调用的模块名称空间。哪里