我需要帮助理解为什么返回值与我期望的不同。我正在使用cmd modu

2024-09-29 08:23:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个文件要处理。menu.pyprogram.py导入的菜单。你知道吗

菜单.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

程序.py

from menu import *
import cmd,sys

lm = loginMenu()
sm = storeMenu()

while True:
    lm.cmdloop()
    print user
    sm.cmdloop()

我想当程序.py到达print user它将打印lilith,但它将打印no one。为什么会这样?postloop()docs中定义为当cmdloop()即将返回时执行的方法,因此我认为它将user的值返回为lilith,然后lilith将被打印,但它只打印no one。你知道吗

编辑:有人建议我不要使用globals。我在读this来找出原因。你知道吗


Tags: nopyimportselfcmdreturndefsys
2条回答

这是因为user的赋值在这里:

def postloop(self):
    user = 'lilith'
    return user

作用于变量的本地实例。要影响全局变量user,需要添加:

global user

到那个函数的顶端。尽管我不推荐它,因为通常有比使用globals更好的方法。你知道吗

关于globals和python的一个注释。如果没有global关键字,就不能给全局var赋值,但是如果没有它,就可以读取全局(和其他非本地)作用域。这允许您创建闭包。你知道吗

cmd与此无关。user = 'lilith'引入了一个新的本地绑定。要重新绑定全局名称,需要执行以下操作:

global user
user = 'lilith'

另外,你应该避免使用globals。你知道吗

相关问题 更多 >