请看我的python石头剪刀程序
我遇到的主要问题是,当用户在玩电脑(随机函数)时,试图获得总的胜负和平局。但每当我为玩家选择的石头剪刀输入1、2或3时,我总是会遇到这个错误。请看我的python石头剪刀程序,python,Python,我遇到的主要问题是,当用户在玩电脑(随机函数)时,试图获得总的胜负和平局。但每当我为玩家选择的石头剪刀输入1、2或3时,我总是会遇到这个错误。 Welcome to a game of paper, rock, scissors! Please input the correct number according to the object. Select rock(1), paper(2), or scissors(3): 2 Computer chose ROCK . You chose
Welcome to a game of paper, rock, scissors!
Please input the correct number according
to the object.
Select rock(1), paper(2), or scissors(3): 2
Computer chose ROCK .
You chose PAPER .
Traceback (most recent call last):
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line
114, in <module>
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line
43, in main
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line
106, in determine_winner
builtins.UnboundLocalError: local variable 'win' referenced before assignment
函数
determinate\u winner()
无法查看您在main()
中定义的变量win
、tie
和lose
。因此,您不能执行win+=1
在Python中通常不使用main()
例程(我最近在这里看到了一些使用它们的问题-谁在教它?),但是即使您将其内容移动到程序的顶层,它也不会工作,因为win+=1
仍然会因为同样的原因失败
您可以在determinate_winner()
中定义局部变量win
、tie
和lose
,并让它返回它们的值,然后将它们添加到顶层代码中的相应变量中。事实上,在这个函数中甚至不需要这些变量
例如:
def determine_winner(computer_choice, player_choice):
#if its a tie, add 1 to tie variable and display message
if computer_choice == player_choice:
print("It's a tie!")
return 0
#if its a win, add to win variable and display message
elif computer_choice == 'SCISSORS' and player_choice == 'ROCK':
print('ROCK crushes SCISSORS! You win!')
return 1
elif computer_choice == 'PAPER' and player_choice == 'SCISSORS':
print('SCISSORS cut PAPER! You win!')
return 1
elif computer_choice == 'ROCK' and player_choice == 'PAPER':
print('PAPER covers ROCK! You win!')
return 1
#if it does not match any of the win criteria then add 1 to lose and
#display lose message
else:
print('You lose!')
return -1
在顶层:
result = determine_winner(computer_choice, player_choice)
if result == -1:
lose += 1
elif result == 0:
tie += 1
else:
win += 1
Python使用词法作用域。这意味着,如果变量是在函数内部定义的,则该函数外部的代码无法看到它(除非它标记为
global
)
一个快速而肮脏的解决方法是将
win
和任何其他需要从外部main
查看的变量标记为全局
。一个更好的解决方案是重新构造代码。您可以使您的变量赢、输、并列全局。在这里,它们不是。
编辑:我同意全球化不是一个好的解决方案。我认为这不是一个好的解决方案。首先,即使您将它们设置为全局变量,它仍然不起作用,除非您在
determinate_winner()
的开头使用global win
,其次,全局变量几乎从来都不是一个好主意。我同意返回结果比使用全局变量更好。我还以为Oiugghog Jkhkh在问如何使用全局变量。你必须首先将它们移出main()
,否则它们就不会是全局变量。使用global
语句,它们就会是全局变量。并不是说这是最优雅的解决方案。目前,它们未在模块的顶层定义。global
语句不会使局部变量成为全局变量。它告诉函数在全局范围内查找引用的变量,而不是创建一个局部变量。这仅在已经存在这样一个全局变量的情况下才有效。如果在函数顶部说global win
,然后在其后指定win
,则即使在顶级模块代码中没有指定该变量,该指定也将指定给全局变量win
。我刚刚用OP的代码测试了它,它可以工作。好的,但前提是你在所有函数中都使用global
的东西,并确保它们首先被分配到0(在这种情况下确实可以工作)。在这一点上,将main()
函数完全移动到顶层会更有意义。非常感谢!我已经盯着这个问题好几个小时了!即使您不使用main()
函数,也最好将主代码放在if\uuu name\uuu==“\uu main\uuuuu”:
语句下。实际上,底部的if\uu name\uuuuu=“\uu main\uuuuuuu”:main()
行通常由我见过的每个人完成。我认为这样做的一个目的是,可以在不运行main
中的所有代码的情况下导入文件。因此,您可以使用一个假设的randRGB()
函数或来自外部脚本的文件中的某些内容。@Tangmeister:main()
中的代码在导入期间无论如何都不会运行。只有模块级的代码会,所以将其放在if…
语句下是有意义的(正如Joel Cornett上面提到的)。我可能被误解了,但我也说过main
中的代码不会运行。所以这是个人品味的问题。
result = determine_winner(computer_choice, player_choice)
if result == -1:
lose += 1
elif result == 0:
tie += 1
else:
win += 1