Python 变量未在函数中更新
我是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
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?