函数调用自身时全局丢失
Posted
技术标签:
【中文标题】函数调用自身时全局丢失【英文标题】:Globals lost when function calls itself 【发布时间】:2021-12-10 08:40:31 【问题描述】:我需要在运行时将变量“a”添加到全局变量中,并且可以随时从 Item 类中恢复它。结果:在全局变量中看不到。
下面有一个例子。当我打印 globals() 时,我找不到新的“a”变量。
具体来说,我需要能够将 printVal 结果保存在一个名为“a”的变量中,我可以在下次调用此函数时查阅该变量。
在我的最终程序中,我计划添加任意数量的不同变量(变量和值)。
例子:
class Item():
def printVal(self,value):
return value
def func(self):
userInput = input("Input string:")
if userInput!="0":
exec("a=self.printVal(\""+userInput+"\")",globals(),locals())
else:
return
print(globals())
self.func()
if __name__ == "__main__":
item = Item()
item.func()
【问题讨论】:
输入到底是什么?只是“一个”?更好的是,制作这个脚本的测试副本,而不是输入一些东西,让 func 取一个值。然后item.func("whatever the test is")
。将input
排除在外,您就有了一个具体的示例,而不会增加复杂性。
如果您想将a
添加到全局变量中,只需使用global a; a = <foo>
在这里使用exec
是什么想法?似乎没有意义。
这很像 XY 问题。您能否详细说明您想要实现的目标。我怀疑存在一些混乱/缺乏理解如何使用/使用类/OOP。为什么递归调用?也许你只需要一个实例属性?
"func" 将充当菜单,用户将输入要调用的变量和函数:例如,他将输入“a
【参考方案1】:
如果您只想设置一个全局变量,其名称是在运行时生成的,您可以这样做:
globals()[name] = val
顺便说一句,printVal
方法是假的。只返回它得到的东西。
【讨论】:
我最终采用了另一种方法,但这很有效,而且是一个非常简单的解决方案。谢谢!以上是关于函数调用自身时全局丢失的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 挂起函数在调用 java 时丢失 ReactiveSecurityContext