请看我的python石头剪刀程序

请看我的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

我遇到的主要问题是,当用户在玩电脑(随机函数)时,试图获得总的胜负和平局。但每当我为玩家选择的石头剪刀输入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 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