簡體   English   中英

Python全局變量不起作用

[英]Python Global Variable Not Working

我正在編寫的Canasta游戲有一個非常長的程序,其中有一個變量,如果變量等於某個值,該變量將結束玩家的回合。 但是,轉彎會重復。

我在類似這樣的論壇上閱讀了許多不同的文章和帖子,但這些似乎都沒有用。 我什至有一個調試系統,可以在if語句之前打印變量的值,並且該變量是正確的值,但是if語句看不到相同的值。

我不能給出整個代碼,因為它很長,但是我可以給出使用該變量的部分。 我正在使用Python 2.7.2,無法將文件與要導入的主文件分開。

該程序的第一行是:

endTurn=1

當滿足贏得游戲的條件時,將調用以下函數,但是由於該錯誤,我無法測試該函數是否有效。

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

進行移動時將調用以下函數。 decide的變量是raw_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 我要求查看該代碼的任何人都不要對其進行修改,以便其他人可以看到真實的代碼。

我已修復該錯誤。 我刪除了endTurn變量,而是制作了結束回合的功能,只是進行下一個玩家的回合。 這也簡化了我的代碼。

我想知道,是否正在使用這種方法在自身內部一遍又一遍地運行一個函數(不離開),卻很雜亂,或者可能會使我的程序變慢?

編輯:我現在意識到,這個答案並不能完全幫助那些陷入全局變量的人。

我發布的上一個答案是錯誤的,因為它是基於我閱讀它們時對名稱空間文檔的誤解(感謝TheifMaster指出了我的錯誤),所以這是一個經過嚴格編輯的答案:

問題出在while循環中,當我在前面給出的錯誤答案后發布了指向整個代碼的鏈接時,我能夠讀取它。

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

直到gameWinner!= 0,游戲才能在此循環中到達第二位玩家。 我將整個代碼添加到沙箱中,並將其更改為:

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

但是,游戲仍然存在錯誤……沒有人能贏! 除非您將它添加到global語句中,否則不會通過winGame()函數來全局更改gameWinner,如我在此處所示。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM