我是一名編碼初學者,正在為游戲組合一個專案。為了更新游戲板,我使用了這個函式:
Board = [0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
def boardupdate(self, move):
for index, val in enumerate(move):
try:
if val >= 15:
val -= 3
move[index] = val
except TypeError:
pass
try: self[move[0]] = 1
except Exception: None
try: self[move[1]] = 0
except Exception: None
try: self[move[2]] = 0
except Exception: None
return self
串列的第一項move表示輪子放置棋子的位置,第二項表示從何處取出棋子(在此游戲中,您可以在棋盤上放置新棋子或移動棋子),第三項表示棋子從游戲中完全移除的位置。某個轉彎可能涉及這些動作中的任何一個或不涉及這些動作,因此tryandexcept塊(我今天才學到,所以如果我不正確地使用它們,將不勝感激)。
代碼在函式內部按預期作業,但由于某種原因,在呼叫此函式后,代碼Board會發生變化,就好像它是通過函式運行一樣。
print(Board)
print(boardupdate(Board, [0, None]))
print(Board)
回傳:
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
I've tried to solve this by copying Board to a temporary variable like so:
def boardupdate(self, move):
tempboard = self
for index, val in enumerate(move):
try:
if val >= 15:
val -= 3
move[index] = val
except TypeError:
pass
try: tempboard[move[0]] = 1
except Exception: None
try: tempboard[move[1]] = 0
except Exception: None
try: tempboard[move[2]] = 0
except Exception: None
return tempboard
Returns the same output as before. How can I change the output of this function without messing around with the initial conditions of Board? This is necessary in order for the rest of my code to run. Thanks!
uj5u.com熱心網友回復:
tempboard = board不復制board,它只是系結tempboard到與board. 如果你這樣做:
tempboard = board.copy()
它實際上會復制board.
關于此功能的其他一些其他建議:
- 不要呼叫 board parameter
self,因為這不是 board 本身的實體方法。只需將其稱為board. - 不要盲目地捕捉所有例外;它使錯誤很難除錯。如果您的代碼中有錯誤,您希望它引發例外,這樣您就可以立即確切地看到哪里出了問題,而不是花費數小時試圖弄清楚為什么它什么也沒做!我建議采用一種約定,即您沒有采取的行動是
None,然后None專門檢查,而不是僅僅忽略任何引發例外的嘗試行動。 - 使用命名變數和/或注釋來跟蹤不同
move專案所代表的內容。
def boardupdate(board, move):
board = board.copy()
# Subtract 3 from any move positions >= 15.
move = [p if p is None or p < 15 else p - 3 for p in move]
[moved_to, moved_from, removed] = move
if moved_to is not None:
board[moved_to] = 1
if moved_from is not None:
board[moved_from] = 0
if removed is not None:
board[removed] = 0
return board
uj5u.com熱心網友回復:
您只是指向Board,而不是實際復制它。在 python 中,出于效率原因,默認情況下不會復制可迭代物件。例如:
x=[1,2,3]
y=x
y[1]=5
print(x)
[1,5,3]
為了克服這個問題,你應該Board在函式內部做一個深拷貝:
tempboard = self.copy()
或者當您呼叫該函式時:
boardupdate(Board.copy())
這對于不可變物件(例如整數)來說是不同的:
x=5
y=x
y =1
print(x)
5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424912.html
標籤:python python-3.x function variables
上一篇:為什么在Rust中使用可變引數鏈接和呼叫C函式會導致呼叫隨機函式?[復制]
下一篇:Python最終阻止不捕獲錯誤
