最好(也是最快)的事情是采取简单的方法并重命名变量。但是,如果您坚持,您可以通过以下方式解决命名冲突:
import sys
_global = sys.modules[__name__]
# or _globals = sys.modules[__name__].__dict__
myVar = 1
def myFunction(myVar):
_global.myVar = myVar # or _globals['myVar'] = myVar
print myVar # 1
myFunction(42)
print myVar # 42
解释:
在模块中,模块的名称(作为字符串)可用作全局变量的值__name__
。该名称sys.modules
是指将模块名称映射到已加载的模块的字典。如果myFunction()
正在运行,它的模块已经被加载,所以那个时候sys.modules[__name__]
是它定义的模块。由于全局变量MyVar
也在模块中定义,因此可以使用sys.modules[__name__].myVar
. (为了使其用法类似于 java,你可以命名它this
——但我个人认为_global
更好。)
此外,由于模块的只读__dict__
属性是它的命名空间——也就是全局命名空间——表示为字典对象,sys.modules[__name__].__dict__
是另一种引用它的有效方式。
请注意,在任何一种情况下,如果对不存在的名称进行分配,都会创建新的全局变量——就像使用global
关键字一样。