更改列表中列表中的元素会更改整个列-python

时间:2020-05-21 12:31:16

标签: python python-3.x

因此,我试图获得一个画板,例如一个坐标系,其宽度为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','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

我在代码中尝试查找错误已有很长时间了,请帮助我

2 个答案:

答案 0 :(得分:1)

self.board.append(extra)

此行将与该行相同的对象附加到每一列。因此,如果通过一行更改对象,则所有其他行也会看到效果。

您可以复制该行的副本以添加。

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

您的代码应该可以工作

答案 1 :(得分:0)

其他方式:您需要更改循环,

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 ""