在列表中改变列表中的元素,从而改变整个列 - python

问题描述 投票:0回答:1

所以,我试图得到一个像画板一样的坐标系,宽度为10,高度为5,所以它看起来像这样由列表中的列表表示,例如[['x','x','x','x','x','x'。 'x','x','x','x'],['x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x']]

印出来是这样的

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

现在我想改变其中的一个元素,使它看起来像这样。

xxcxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

我的代码。

class Paintboard():

    def __init__(self, width, height):

        self.width = width
        self.height = height

        extra = []
        self.board = []
        for x in range(0, self.width):
            extra.append('x')
        for y in range(0, self.height):
            self.board.append(extra)

    def str(self):

        for x in self.board:
            print(" ".join(x))

        return ""

    def paint(self):

    self.board[0][3] = "c" # here btw x and y are switched cuz of element arrangement in self.board

test = Paintboard(10, 5)
test.paint()
test.str()

而不是仅仅替换[3,0]上的元素,它实际上是替换列中的每一个元素,由于某些原因输出。

xxxcxxxxxx
xxxcxxxxxx
xxxcxxxxxx
xxxcxxxxxx
xxxcxxxxxx

我一直在努力寻找错误,现在很长一段时间在我的代码,请帮助我。

python python-3.x
1个回答
1
投票
self.board.append(extra)

这一行将与行相同的对象追加到每一列。因此,如果你通过一行改变对象,其他所有行也会看到效果。

你可以复制一行来追加对象。

self.board.append(extra.copy())

你的代码应该可以工作


0
投票

另一种方式:你需要改变for loop。

class Paintboard():

    def __init__(self, width, height):

        self.width = width
        self.height = height

        self.board = []

        for y in range(0, self.height):
            extra = []
            for x in range(0, self.width):
                extra.append('x')
            self.board.append(extra)

    def str(self):

        for x in self.board:
            print(" ".join(x))

        return ""
© www.soinside.com 2019 - 2024. All rights reserved.