如何将函数参数分配给具有完全相同名称的全局变量?
注意:
我无法做self.myVariable = myVariable
,因为我的函数不属于类。
编写以下代码时,我收到一条错误消息,指出“参数既是本地的又是全局的。”
myVar = 1
def myFunction(myVar):
global myVar
这不可能吗?如果是这样在其他语言中不常见?来自java我习惯this.myVar = myVar
编辑我已经知道我可以重命名该变量。这是最简单的方法。
答案 0 :(得分:7)
最佳解决方案:重构您的代码。重命名,或使用具有对象属性的对象而不是全局变量。
替代方案,hacky解决方案:直接修改全局变量dict:
my_var = 1
def my_function(my_var):
globals()['my_var'] = my_var
答案 1 :(得分:1)
最好(也是最快)的事情就是采取简单的方法并重命名变量。但如果你坚持,你可以用这个来解决命名冲突:
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__
是引用它的另一种有效方式。 / p>
请注意,在任何一种情况下,如果对不存在的名称进行分配,则会创建新的全局变量 - 就像使用global
关键字一样。
答案 2 :(得分:1)
答案是欺骗Python做这件事。在您的代码中:
myVar = 1
def myFunction(myVar):
global myVar
永远不会运行myFunction(你永远不会打电话)。因此,脚本永远不会到达global myVar
点。然而,由于某种原因,Python仍然会爆炸。我相信那是因为它被告知“不要允许这个”。无论如何,你可以欺骗它做你想做的事。未建议的一种方法是在myFunction中使用一个简单的函数:
myVar = 1
def myFunction(myVar):
def trick(arg):
global myVar
myVar = arg
trick(myVar)
print myVar # Comes back with 1
myFunction(22)
print myVar # Comes back with 22
可能不在一行,但您不必导入任何内容,而且更容易阅读。