Python:更改嵌套列表的值

时间:2015-03-03 06:27:17

标签: python list replace nested

所以我使用嵌套列表来存储一些数据,而我在更改其中一个子列表的特定值时遇到问题:

if attributes[3] == 'W':
    self.board[3][3] = 'W'

(数字是我用来测试的占位符)

board是一个类变量,它创建如下(我正在尝试创建一个用户指定的网格,其列和行大小的输入构成属性的前两部分)

self.board = []
rows = []
self.score = [0, 0]
for x in range(attributes[0]):
    rows.append('')
for y in range(attributes[1]):
    self.board.append(rows)

但是,每当我尝试更改子列表的值时,它都会更改同一索引的所有子列表的值:

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

我无法弄清楚出了什么问题。有人有什么想法吗?

2 个答案:

答案 0 :(得分:2)

self.board.append(rows),您在循环中追加相同的列表。您需要的是附加行列表的副本:self.board.append(rows[:])

因此修改后的代码将是:

self.board = []
rows = []
self.score = [0, 0]
for x in range(attributes[0]):
    rows.append('')
for y in range(attributes[1]):
    self.board.append(rows[:])

答案 1 :(得分:0)

我认为这个原因可以在这个非常简单的例子中得到证明:

a = [1,2,3]

b = [a,a,a] # <- this is what you are actually doing

print(list(map(id,b)))
#[140475353832712, 140475353832712, 140475353832712]

请注意,以上所有ID都是相同的。这意味着您在列表中进行操作,对同一对象的引用。因此改变一个生存者,改变每个子列表。

但是,您应该这样做(或等效):

b2 = [a[:], a[:], a[:]] #
print(list(map(id,b2)))
#[140475353832136, 140475353832072, 140475353832520]

请注意,每个子列表的ID不同。现在b2包含对不同子列表的引用。

总结一下,你应该这样:

for y in range(attributes[1]):
    self.board.append(rows[:])