5
class Board:

    def __init__(self):
        self.board = self.createBoard()

    def createBoard(self):
        line = []
        for i in range(7):
            line.append(' ')
        board = []
        for i in range(7):
            board.append(line)
        return board

    def showBoard(self):
        line = "| "
        for x in range(len(self.board)):
            for y in range(len(self.board)):
                line += self.board[x][y] + " | "
            print("-" * 29)
            print(line)
            line = "| "
        print("-" * 29)

if __name__ == '__main__':
    board = Board()
    board.showBoard()
    board.board[1][1] = "O"
    board.showBoard()

この本当に奇妙な問題に行き詰まったとき、私は connect-4 python コンソールのデモ/ゲームに取り組んでいました。

上記のコードの出力は次のとおりです。

-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------

奇妙なことに、Oこれらすべての位置に割り当てたわけではなく、[1][1] の位置にのみ割り当てました。

出力は次のようになると予想していました。

-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   | O |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------
|   |   |   |   |   |   |   | 
-----------------------------

明らかで小さなものを見落としている可能性が非常に高いですが、1時間以上探して試してみましたが、実際には問題を見つけることができません.

私のboard.boardリストが他の2次元リストよりも奇妙であるというわけではありません。

[[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']]

(それは私が得たものですprint(board.board)

それをコピーして IDLE に貼り付けると、次のようになります。

>>> a = [[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']]
>>> a[1][1] = "O"
[[' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', 'O', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' ', ' ']]

これにより、適切なボード値が得られます。

私のコードで明らかに間違っているのは何ですか? 恥ずかしくて首を横に振るような答えを誰かが見つけたとき、それはおそらく悪いことだと確信しています.

十分な自己恥ずべきことですが、なぜ私のコードboard.board[1][1] = "O"は値「O」を のすべての行に割り当てるのboard.boardでしょうか?

最初の 1 を 0 ~ 6 の他の数字に変更しても、何も変わりません。それはすべて同じです。

4

2 に答える 2

0

これは、参照を使用する python の問題です。CreateBoard の第 2 部

    for i in range(7):
        board.append(line)

外側のリストに同じリストへの参照を 7 つ入れています。したがって、同じリストの 7 つのコピーのリストがあります。これらのサブリストのいずれかの値を編集すると、同じメモリを参照しているため、実際にはすべてが更新されます。

1 つのオプションは、copy.deepcopy を使用するか、行ごとに新しいリストを明示的に作成することです。

import copy  # at the top of the file
for i in range( 7 ):
    board.append( copy.deepcopy( line ) )

また

for i in range( 7 ):
    board.append( list(' ' * 7) )
于 2013-09-06T23:28:20.033 に答える