包之间的Python全局变量解析是如何工作的?

2024-04-28 22:56:33 发布

您现在位置:Python中文网/ 问答频道 /正文

Python如何在包之间的调用中解析全局变量,特别是在存在同名全局变量的情况下?你知道吗

例如。让那里有一个包P1,包含BaseClass。假设有两个包P2P3,其中包含相应继承Derived1Derived2的类。另外,让P2P3都包含名为gvar的变量(例如,在它们的init.py文件中定义)。你知道吗

它们的构造函数中的两个派生类都通过super调用了baseClass构造函数。你知道吗

如果在BaseClass构造函数中有对gvar的引用,会发生什么?有没有一种方法可以确保在实例化Derived1gvar时使用来自P2gvar?你知道吗

为什么我要处理全局变量:在我的现实生活中,在P1P2中有几十个类,我希望避免更改它们(将包特定的gvar添加到它们的定义中,或者添加另一个共同的祖先)。你知道吗


Tags: 文件py定义init情况p2p3p1
2条回答

全局变量是每个模块的P1P2P3中的全局变量都是独立的。你知道吗

Python函数还存储一个指向其模块的globals映射的指针,因此即使在导入时,globals仍然会在定义它们的模块中查找。你知道吗

对于您的示例,这意味着在P2中查找从P2.Derived1.__init__引用的全局,在P3中查找从P3.Derived2.__init__引用的全局。这两个包都需要导入P1.BaseClass,任何可能查找的globalsP1.BaseClass.__init__都来自P1。你知道吗

“全局”变量仅对定义它们的模块(即文件)是全局的。如果给定文件中有一个函数(包括一个方法),并且该函数引用了一个全局变量gvar,那么它将始终引用该模块中的一个全局变量gvar,而不是任何其他模块中的全局变量。你知道吗

但是,您可以从模块外部修改或创建全局变量。例如,如果执行import blah,然后执行blah.gvar = 2,则实际上在blah内创建了一个全局变量gvar(或者更改了它的值,如果它已经存在),而blah内引用gvar的代码将使用您设置的值。你知道吗

相关问题 更多 >