在模块之间更改 python 全局变量
Posted
技术标签:
【中文标题】在模块之间更改 python 全局变量【英文标题】:Changing python global variables between modules 【发布时间】:2012-06-03 11:40:36 【问题描述】:我正在尝试将更改从全局变量转移到 Python2.7 中的另一个模块。 我以前在类似的情况下做过这个,但由于某种原因,它在这种情况下不起作用。 第一个文件是运行程序的文件。它设置一个全局变量并根据所选选项对其进行更改。我在下面粘贴了一些代码。 runnerMod:
import Tkinter
from main_mod import*
choice = "0"
def main():
main_mod=functOne()
class GUI(Tkinter.Tk):
def __init__(self, parent):
Tkinter.Tk.__init__(self, parent)
self.parent = parent
self.initialize()
def initialize(self):
self.grid()
self.update()
btnOption1 = Tkinter.Button(self, text=u"Option 1", command=self.onButtonClick)
btnOption1.grid(column=0, row=1)
def onButtonClick(self):
selection = "1"
self.destroy()
exec 'choice=%s' %selection in globals()
main()
class menuSelection:
def OPTIONCHOSEN(self):
return choice
if __name == "__main__":
app = GUI(None)
app.mainloop
我希望 runnerMod.py 中的名为 selection 的全局变量能够延续到该模块。 main_mod:
from runnerMod import menuSelection
def functOne():
userInput = menuSelection().OPTIONCHOSEN()
print userInput
全局变量选择从 0 开始,但我想在 runnerMod.py 模块中将其更改为 1,并将其反映在 main_mod.py 模块中。由于我正在重写现有程序的接口,因此我的选择在其编码方式上有点受限。有人在这里有什么想法吗?
【问题讨论】:
你为什么要用eval修改choice
?为什么不简单地global choice
然后choice = selection
?我问是因为menuSelection
应该可以正常工作,所以我猜这个值并没有真正改变。
据我所知,结果相同。我只是使用 eval 因为它与程序中其他地方的代码一致。无论哪种方式,它都会更改全局变量,但不会将该更改传递给其他模块
那我不确定是哪里出了问题。我可以使用您的代码在两个模块之间修改和携带变量。我的python是2.7.3,不知道有没有关系。
这很奇怪。正如我所说,我在程序的其他地方确实有非常相似的代码,但由于某种原因,这个特定的变量不会发送出去。这对我要附加的程序也很重要。我想代码中可能有其他东西干扰了这个。
一致性很好,但不足以证明新代码使用邪恶的exec
和eval
。
【参考方案1】:
事实证明,我无法从 runnerMod.py 传递对全局变量的更改,因为它是启动程序的模块。我要做的是使用 runnerMod.py 启动程序,然后调用 main_mod.py 中的函数。这个函数调用了 runnerMod.py 中的一个类并加载了 GUI。只有通过回调然后修改全局变量,我才能传递更改。
【讨论】:
以上是关于在模块之间更改 python 全局变量的主要内容,如果未能解决你的问题,请参考以下文章
我想请教一下,powershell的脚本之间如何传递全局变量。
Python入门-5函数:04变量的作用域-全局变量-局部变量-栈帧内存分析-效率测试