Python: 改变嵌套列表的值
Python: Changing values of a nested list
所以我使用嵌套列表来存储一些数据,但我在更改其中一个子列表的特定值时遇到了问题:
if attributes[3] == 'W':
self.board[3][3] = 'W'
(数字是我用来测试的占位符)
board 是一个 class 变量,创建方式如下(我正在尝试创建用户指定的网格,他们输入的列和行大小构成属性的前两部分)
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', '', '', '', '']]
我不知道出了什么问题。有人有什么想法吗?
我认为这个原因可以在这个非常简单的例子中得到证明:
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[:])
通过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[:])
所以我使用嵌套列表来存储一些数据,但我在更改其中一个子列表的特定值时遇到了问题:
if attributes[3] == 'W':
self.board[3][3] = 'W'
(数字是我用来测试的占位符)
board 是一个 class 变量,创建方式如下(我正在尝试创建用户指定的网格,他们输入的列和行大小构成属性的前两部分)
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', '', '', '', '']]
我不知道出了什么问题。有人有什么想法吗?
我认为这个原因可以在这个非常简单的例子中得到证明:
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[:])
通过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[:])