[英]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.