0

Python とクラスを使用して、主に練習用に戦艦のようなゲームを作ろうとしています。そこで、ゲーム ボード オブジェクトを作成しました。それを「見て」「変更」します。(後で「create」を init にマージします)

しかし、私の「変更」がすべての行に適用される場所で何か奇妙なことが起こっています...コードは次のとおりです。

class Board:
    'Game Board'
    topMarkers = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    sideMarkers = list(range(0, 26))


    def __init__(self,h,w): #Makes the map
        self.height = h
        self.width = w


    def create(self): #Makes a map for displaying
        wave = '~'
        self.row = []
        self.column = []
        #self.column = wave * self.width # If width is 4, column is now '~~~~'

        for c in range(self.width):
            self.column.append(wave)


        raw_input(self.column)

        for r in range(self.height): #
            self.row.append(self.column)

        raw_input(self.row)

    def showGrid(self):

        print self.row

    def changeRow(self, y, x):
        self.row[1][2] = "Test"







yourShipsMap = Board(4,3)

theirShipsMap = Board(4,7)


theirShipsMap.create()

theirShipsMap.changeRow(2,2)
theirShipsMap.showGrid()

これを実行すると、最初のリストの 2 番目のインデックスだけでなく、すべてのリストの 2 番目のインデックスに "Test" が書き込まれます。なぜそれをしているのですか??

1 か月ほどプログラミングをやめて、すべてを忘れてしまうのは嫌です。

4

2 に答える 2

3

列を 1 つだけ作成し、それを行に追加します。リストを別のリストに追加しても、新しいコピーは作成されませんが、同じリストが何度も再利用されます。

[:]スライス構文またはlist()呼び出しを使用して、代わりにコピーを追加します。

for r in range(self.height): #
    self.row.append(self.column[:])

これはあなたに何が起こるかの例です:

>>> column = [1, 2]
>>> row = []
>>> row.append(column)
>>> row.append(column)
>>> column[0] = 'foobar'
>>> row
[['foobar', 2], ['foobar', 2]]

一方、コピーを使用する場合、オリジナルを変更してもコピーは変更されません。

>>> row = []
>>> row.append(list(column))
>>> row.append(column[:])
>>> row
[['foobar', 2], ['foobar', 2]]
>>> column[0] = 1
>>> row
[['foobar', 2], ['foobar', 2]]

上記の例では、元の列リストの (浅い) コピーを作成する両方の方法を使用しました。ディープコピー (リストや dict などの他の変更可能なアイテムを含むリスト)を作成する必要がある場合は、代わりにcopy.deepcopyユーティリティを使用してください。

于 2012-07-27T09:14:10.193 に答える
2
for r in range(self.height): #
    self.row.append(self.column)

同じリスト オブジェクトを追加し続けます。これは、1 つの行で更新された場合に各行に表示されます。

これを試して:

self.row = [['~'] * self.width for r in xrange(self.height)]

これにより、すべての要素が互いに独立したリストのリストが作成されます。

于 2012-07-27T09:13:16.200 に答える