Python全局变量不起作用

时间:2014-08-11 07:11:22

标签: python global

我正在编写一个非常长的Canasta游戏程序,其中有一个变量,如果它等于某个值,则结束玩家的转弯。然而,转弯重演。

我在这样的论坛上阅读过很多不同的文章和帖子,但这些都没有。我甚至有一个调试系统在if语句之前打印变量的值,并且变量是正确的值,但if语句看不到相同的值。

我无法提供整个代码,因为它非常长,但我可以给出使用此变量的部分。我使用的是Python 2.7.2,无法将文件与要导入的主文件分开。

该计划的第一行是:

endTurn=1

当满足赢得游戏的条件时,会调用以下函数,但由于该错误,我无法测试这是否有效。

def winGame(player):
    global endTurn
    gameWinner=player
    gameWinner["score"]+=100
    endTurn=0

进行移动时会调用以下函数。变量decideraw_input()变量。

def move(player,decide):
    global endTurn
    theMove=decide.lower()
    #if player says to end turn
    if theMove=="end":
        #until player discards something
        discarded=0
        while not discarded:
            displayHand(player)
            #ask player for discard
            discard=int(raw_input(" Enter the list number of the card you wish to discard:"))-1
            #if discard ID is in player's hand length
            if not discard<0 and not discard>len(player["hand"])-1:
                #add card to discard pile and remove from hand
                discardPile.append(player["hand"][discard])
                del(player["hand"][discard])
                discarded=1
        debug("Before changing, endTurn is %s"%str(endTurn))
        endTurn = 0
        debug("After changing, endTurn is %s"%str(endTurn))
    if theMove=="new book":
        newBook(player)
    if theMove=="add to book":
        addBook(player)

这是转弯应该结束的地方。 turn(thePlayer)重复该功能。 debug语句显示正确的值0,但if仍然读取1.此函数的顶部有global endTurn

debug("If ending turn, endTurn of %s should be 0."%str(endTurn))
if endTurn==1:
    turn(thePlayer)

非常感谢任何帮助!

编辑:代码可在http://labs.codecademy.com/CV9z#:workspace获得。我要求查看代码的任何人都不会修改它,以便其他人可以看到真正的代码。

2 个答案:

答案 0 :(得分:0)

我修复了这个错误。我删除了endTurn变量,而是使得结束转弯的功能只是转向下一个玩家。它还简化了我的代码。

我很想知道,使用这种方法在自身内部一遍又一遍地运行一个函数(不会离开)相当混乱或者可能会减慢我的程序?

编辑:我现在意识到这个答案并不能完全帮助那些陷入全局变量的人......

答案 1 :(得分:-3)

我发布的上一个答案是错误的,因为它是基于对我读过它们的命名空间文档的错误解释(感谢TheifMaster指出我的错误),所以这是一个严重的编辑答案:

问题是在我之前给出的错误答案之后发布整个代码的链接时,我能够读取的while循环。

while gameWinner==0:
    endTurn=1
    turn(player1)
    if not gameWinner==0:
        endTurn=1
        turn(player2)

在gameWinner!= 0之前,游戏永远不会在这个循环中获得玩家2。 我将整个代码添加到我的沙盒中并将其更改为:

while gameWinner==0:
    endTurn=1
    turn(player1)
    if gameWinner==0: #if player1 did not win yet
        endTurn=1
        turn(player2)

然而,游戏仍然是错误的...没有人能赢! winGame()函数不会全局更改gameWinner,直到您将其添加到我在此处显示的全局语句中。

def winGame(player):
    global endTurn, gameWinner
    gameWinner=player
    gameWinner["score"]+=100
    debug("gameWinner == " + str(gameWinner))
    endTurn=0