2024-04-28 04:38:40 发布
网友
如何将函数参数赋给具有完全相同名称的全局变量?在
注意: 我不能做self.myVariable = myVariable,因为我的函数不在类内部。在
self.myVariable = myVariable
在编写下面的代码时,我得到一个错误:“参数既是局部的也是全局的。”
myVar = 1 def myFunction(myVar): global myVar
这不可能吗?如果是这样的话,在其他语言中是不常见的吗?来自java我习惯于this.myVar = myVar
this.myVar = myVar
编辑我已经知道可以重命名变量。这是最简单的出路。在
最佳解决方案:重构代码。重命名某个对象,或使用具有对象属性的对象而不是全局变量。在
另一种老套的解决方案:直接修改全局变量dict:
my_var = 1 def my_function(my_var): globals()['my_var'] = my_var
答案是诱使Python这么做。在您的代码中:
myFunction从不运行(您永远不会调用它)。因此,脚本永远不会到达global myVar点。然而,Python仍然因为某些原因而爆炸。我认为这是因为有人告诉我“不允许这样”。不管怎样,你可以骗它做你想做的事。一种尚未建议的方法是在myFunction中使用一个简单的函数:
global myVar
可能不在一行,但您不必导入任何内容,而且它更易于阅读。在
最好的(也是最快的)方法是使用简单的方法重命名变量。但如果你坚持,你可以用这个来避免命名冲突:
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更好。)
__name__
sys.modules
myFunction()
sys.modules[__name__]
MyVar
sys.modules[__name__].myVar
this
_global
此外,由于模块的只读__dict__属性是其名称空间,也就是表示为字典对象的全局名称空间,sys.modules[__name__].__dict__是引用它的另一种有效方法。在
__dict__
sys.modules[__name__].__dict__
请注意,在这两种情况下,如果对不存在的名称进行赋值,就像使用global关键字一样,那么将创建新的全局变量。在
global
最佳解决方案:重构代码。重命名某个对象,或使用具有对象属性的对象而不是全局变量。在
另一种老套的解决方案:直接修改全局变量dict:
答案是诱使Python这么做。在您的代码中:
myFunction从不运行(您永远不会调用它)。因此,脚本永远不会到达
^{pr2}$global myVar
点。然而,Python仍然因为某些原因而爆炸。我认为这是因为有人告诉我“不允许这样”。不管怎样,你可以骗它做你想做的事。一种尚未建议的方法是在myFunction中使用一个简单的函数:可能不在一行,但您不必导入任何内容,而且它更易于阅读。在
最好的(也是最快的)方法是使用简单的方法重命名变量。但如果你坚持,你可以用这个来避免命名冲突:
说明:
在模块中,模块的名称(字符串形式)可用作全局变量
__name__
的值。名称sys.modules
是指将模块名称映射到已加载模块的字典。如果myFunction()
正在运行,则其模块已加载,因此此时sys.modules[__name__]
就是它在其中定义的模块。由于全局变量MyVar
也在模块中定义,因此可以使用sys.modules[__name__].myVar
来访问它。(为了使它的用法类似于java,可以将其命名为this
,但我个人认为_global
更好。)此外,由于模块的只读
__dict__
属性是其名称空间,也就是表示为字典对象的全局名称空间,sys.modules[__name__].__dict__
是引用它的另一种有效方法。在请注意,在这两种情况下,如果对不存在的名称进行赋值,就像使用
global
关键字一样,那么将创建新的全局变量。在相关问题 更多 >
编程相关推荐