我正在尝试使用两个文件。 menu.py
具有program.py
导入的菜单。
menu.py:
import cmd,sys
user = 'no one'
class loginMenu(cmd.Cmd):
def postloop(self):
user = 'lilith'
return user
intro="""login menu"""
def do_smtoggle(self,person):
return True
def do_quit(self,person):
sys.exit()
class storeMenu(cmd.Cmd):
intro="""store menu"""
def do_whoami(self,person):
print 'storemenu ' + user
def do_quit(self,person):
quit = True
return quit
program.py :
from menu import *
import cmd,sys
lm = loginMenu()
sm = storeMenu()
while True:
lm.cmdloop()
print user
sm.cmdloop()
我希望当program.py到达print user
时,它会打印lilith
,但会打印no one
。为什么是这样? postloop()
在docs中定义cmdloop()
作为在user
即将返回时执行的方法,因此我认为它会将lilith
的值返回为lilith
并且然后打印no one
,但它只打印{{1}}。
编辑:建议我不要使用全局变量。我正在阅读this以找出原因。
答案 0 :(得分:2)
那是因为此处user
的分配:
def postloop(self):
user = 'lilith'
return user
作用于var的本地实例。要影响全局var user
,您需要添加:
global user
到该函数的顶部。虽然我不推荐它,因为通常有比使用全局变量更好的方法。
关于全局和python的一个注释。虽然您无法在没有global
关键字的情况下为全局变量赋值,但您可以在没有它的情况下读取全局(和其他非本地)范围。这允许你制作闭包。
答案 1 :(得分:2)
cmd
与此无关。 user = 'lilith'
引入了一个新的本地绑定。要重新绑定全局名称,您需要执行以下操作:
global user
user = 'lilith'
另外,你应该避免使用全局变量。