Python 变量未在函数中更新

Python 变量未在函数中更新,python,function,python-3.4,Python,Function,Python 3.4,我是Python新手,但请容忍我 在我的代码中,我试图通过west()函数将变量room设置为2 代码: 编辑:我已经隔离了大部分非必要的代码 room = 1 cmds = 'west'.lower() def isValidCMD(cmd): if cmd in cmds: return True else: print("Unknown command. For help type /help, for available options

我是Python新手,但请容忍我

在我的代码中,我试图通过
west()
函数将变量
room
设置为
2

代码: 编辑:我已经隔离了大部分非必要的代码

room = 1

cmds = 'west'.lower()

def isValidCMD(cmd):
    if cmd in cmds:
        return True
    else:
        print("Unknown command. For help type /help, for available options type /options")
        cmd = input(">> ")
        if isValidCMD(cmd):
            runCMD(cmd)
        return False

def runCMD(cmd):
    if cmd == '/help':
        help()
    elif cmd == '/exit':
        exit()
    elif cmd == '/about':
        about()
    elif cmd == '/stats':
        stats()
    elif cmd == '/options':
        options()
    elif cmd == 'north':
        north()
    elif cmd == 'south':
        south()
    elif cmd == 'east':
        east()
    elif cmd == 'west':
        west()
    elif cmd == '/lookaround':
        look_around()

def west():
    if room == 1:
        print("You head on over to the lab, to get some advice from Professor Andrew.")
        return 2 #LINE 40 < -------
    elif room == 7:
        print("You head back to Auderban Square feeling primed for battle.")
    else:
        print("You cannot go west.")
        cmd = input(">> ")
        if isValidCMD(cmd):
            runCMD(cmd)

def main():
    while True:
        # Town 
        if room == 1:
            print("\nYou are at the centre of town, Auderban Square.".upper())
            print("\nYou look at the signpost and see 4 signs.")
            print("\t- North - Twinleaf Forest")
            print("\t- South - Store of Celestia")
            print("\t- East - Deskemon Training Ground")
            print("\t- West - Auderban's Deskemon centre")
        # Lab
        elif room == 2:
            print("You are at Auderban's Deskemon Centre")
            AndrewConv()
            print("\nYou see the exit at the door.")
            print("\t- East - Auderban Square")

        cmd = input(">> ")
        if isValidCMD(cmd):
            runCMD(cmd)
main()
room=1
cmds='west'.lower()
def isValidCMD(cmd):
如果cmds中有cmd:
返回真值
其他:
打印(“未知命令。用于帮助类型/帮助,用于可用选项类型/选项”)
cmd=输入(“>>”)
如果isValidCMD(cmd):
runCMD(cmd)
返回错误
def runCMD(cmd):
如果cmd=='/help':
帮助()
elif cmd=='/exit':
退出()
elif cmd=='/about':
关于()
elif cmd=='/stats':
统计数据()
elif cmd=='/options':
选项()
elif cmd==“北”:
北()
elif cmd==“南部”:
南部()
elif cmd==“东”:
东()
elif cmd=='west':
西()
elif cmd=='/lookaround':
环顾四周
def west():
如果房间==1:
打印(“你去实验室,从安德鲁教授那里得到一些建议。”)
返回2#第40行<-------
elif房间==7:
打印(“你回到奥德班广场,感觉准备战斗。”)
其他:
打印(“你不能往西走。”)
cmd=输入(“>>”)
如果isValidCMD(cmd):
runCMD(cmd)
def main():
尽管如此:
#城镇
如果房间==1:
打印(“\n您位于市中心奥德班广场。”.upper())
打印(“\n您查看路标,看到4个路标。”)
打印(“\t-北-双叶林”)
打印(“\t-南-Celestia商店”)
打印(“\t-东部-Deskemon训练场”)
打印(“t-West-Auderban的桌面中心”)
#实验室
elif房间==2:
打印(“您在Auderban的桌面中心”)
安德鲁孔夫()
打印(“\n您看到门口的出口。”)
打印(“\t-东-奥德班广场”)
cmd=输入(“>>”)
如果isValidCMD(cmd):
runCMD(cmd)
main()
输出: 但是
room
保留其值,
1

请为将来提供一些建议,这样我就不会再犯同样的错误了。

用以下内容替换
west()
函数:

def west():
    global room
    ...

全局变量被广泛认为是糟糕的编程实践,因为在大型程序中很难确定何时何地修改它们。它们还使得线程安全和可重入代码几乎不可能编写

一种简单的方法是让每个函数接受
room
作为参数,并返回“newroom”。然后每次调用命令时,都可以更新主函数中的
room

不过,你最终可能会记录的不仅仅是房间。考虑使用类似字典或类的可变数据结构来存储游戏状态,然后将其传递到命令函数中。这样,就可以像处理一个变量一样简单地处理多个状态变量,而且您仍然不需要全局变量

def main():
    state = {'room': 1}
    while True:
        [...]
        if isValidCMD(cmd, state):
            runCMD(cmd, state)

def west(state):
    thisroom = state['room']
    if thisroom == 1:
        print("You head on over to the lab, to get some advice from Professor Andrew.")
        state.update(room=2)
    elif thisroom == 7:
        print("You head back to Auderban Square feeling primed for battle.")
    else:
        print("You cannot go west.")
        cmd = input(">> ")
        if isValidCMD(cmd):
            runCMD(cmd)
此代码还存在一些其他问题。例如,在每个命令提示符中复制命令提示符代码,这很容易出错,而且不必要,因为您将返回到
main()

已编辑:以下是一个最小的可运行示例:

def main():
    state = {'room': 1}
    for i in range(20):
        oldroom = state['room']
        nextroom(state)
        print("Went from room {} to room {}.".format(oldroom, state['room']))

def nextroom(state):
    state['room'] += 2

room=west(room)
(更喜欢显式参数而不是范围)在哪里将值更改为2?您甚至不调用
west()
。好的,我将在中添加其余的代码。完成。好的,但是在
west()
中,您绝对不需要做任何事情来更改
room
的值。runCMD必须返回west(),并且必须将runCMD的返回值保存到room。也许关于这个问题的更多信息,而不是直接的,会更好…不幸的是,
room
没有更改为
2
,只是保持不变。这种方法不会更改全局
room
变量。它更改与传递到每个函数的
main()
范围内的可变对象中的
'room'
键关联的值。我发布的是完整程序关键部分的概要,但这种方法绝对有效。是的,你的最小可运行示例也不起作用。也许您的程序只适用于PYthon 2.7.6?