函数调用自身时全局丢失

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 方法是假的。只返回它得到的东西。

【讨论】:

我最终采用了另一种方法,但这很有效,而且是一个非常简单的解决方案。谢谢!

以上是关于函数调用自身时全局丢失的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中this指向的四种绑定规则

函数的递归

Kotlin 挂起函数在调用 java 时丢失 ReactiveSecurityContext

使用xlwings在excel中的函数调用之间保留python全局变量

PHP递归函数

看一遍就能掌握 js 中的 this 指向