遍历2d列表python不会正确更改值

时间:2018-10-19 04:56:15

标签: python list for-loop

我试图遍历列表列表并更改值。我希望它打印[['1','2'],['3','4']]。但它显示[[''3','4'],['3','4']]。谁能解释为什么会这样吗?当我输入打印语句时,请为每次迭代增加计数。

编辑:如果我手动创建类似[[0,0],[0,0]]的列表,则可以使用。那么[[0] * 2] * 2有何不同之处?它们看起来都像是二维列表。

class Sudoku:
    def __init__(self):
        self.board=[[0]*2]*2

s=Sudoku()
count=1
for i in range(2):
   for j in range(2):
       s.board[i][j]=count
       count+=1
print(s.board)

1 个答案:

答案 0 :(得分:4)

[0]*2得出列表[0, 0]。我们称它为鲍勃。

那么

[[0]*2]*2[Bob, Bob]-指向同一鲍勃的两个引用的列表。你换鲍勃,鲍勃换。

为了能够独立更改两个子数组,它们必须不能是共形的-这意味着您不能使用*将引用复制到内部可变对象(Bob):

[[0]*2 for i in range(2)]

这将为i == 0构建Bob,并为i == 1构建Bob的双胞胎兄弟(Rob?)。您更改Bob,Rob不在乎。

请注意,这不适用于[0]*2中的零:数字不是可变类型,除了完全替换零之外,您无法对零进行任何操作。

  

如果我手动创建类似[[0,0],[0,0]]的列表,则可以使用。那么[[0] * 2] * 2有什么不同之处?

好的,手动进行实验。

bob = [0, 0]                 # our Bob.
rob = [0, 0]                 # Rob _looks_ the same, but _is not_ the same
bob_and_bob = [bob, bob]     # [[0, 0]]*2
bob_and_rob = [bob, rob]     # [[0, 0], [0, 0]]

bob[0] = 1                   # we change Bob...
bob_and_bob                  # => [[1, 0], [1, 0]]  Bob changes.
bob_and_rob                  # => [[1, 0], [0, 0]]  Rob doesn't care.