Python列表表现很奇怪

时间:2015-03-04 23:33:36

标签: python

这可能是一个重复的问题,但不同之处在于当我使用for循环时发生错误。要解释一下,如果我有清单:

x = [[1,2,3],[1,2,3],[1,2,3]]

我做了

x[0][0] = 5

列表将更改为

[[5,2,3],[5,2,3],[5,2,3]]

评论指出上述内容可能不正确,下面直接从控制台输出:

>>> x = Board()
>>> x.create(6,6)
[['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', '']]
>>> x.board
[['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', ''], ['', '', '', '', '', '']]
>>> x.board[0][1]
''
>>> x.board[0][1] = 1
>>> x.board
[['', 1, '', '', '', ''], ['', 1, '', '', '', ''], ['', 1, '', '', '', ''], ['', 1, '', '', '', ''], ['', 1, '', '', '', ''], ['', 1, '', '', '', '']]
>>> 

其他答案中描述的解决方案涉及创建一个for循环来创建一个新的列表元素,但是我不知道如何在我的代码中实现它,如下所示 -

class Board():
   def create(self, rows, cols):
        self.board = []
        col_template = []
        for col in range(cols):
                col_template.append("")
        for row in range(rows):
            self.board.append(col_template)
        return self.board

rows, cols有些甚至是整数

1 个答案:

答案 0 :(得分:4)

我认为你需要这样做:

  self.board.append(col_template[:])

否则,您的电路板将引用相同的阵列。

你的正确例子应该是:

a=[1,2,3]
x = [a,a,a]
x[0][0] = 5
print(x) # [[5, 2, 3], [5, 2, 3], [5, 2, 3]]

解决上述问题:

a=[1,2,3]
x = [a[:],a[:],a[:]]
x[0][0] = 5
print(x) # [[5, 2, 3], [1, 2, 3], [1, 2, 3]]

这是因为x只存储对同一列表的引用a。您需要明确创建a[:]的副本(由a完成)以在x中创建不同的子列表。