当我按照以下方式初始化二维矩阵时,行为对我来说非常奇怪。
In [1]: matrix = [[None] * 2] * 3
In [2]: matrix
Out[2]: [[None, None], [None, None], [None, None]]
In [3]: matrix[0][0] = 5
In [4]: matrix
Out[4]: [[5, None], [5, None], [5, None]]
我现在知道我应该通过以下方式初始化它以避免这种奇怪的行为:
matrix = [[None for x in range(2)] for x in range(3)]
有人可以解释为什么在前一种情况下我会在多个数组中得到重复的值,这种行为有好处吗?
因为这些值都是相同的对象,相同的id
,所以你需要这样做:
matrix = [[None] * 2 for i in range(3)]
一个范围
就足够了,id
现在会有所不同。
不起作用的原因:
matrix
变量包含三个相同的项,完全相同,当您使用range
时,不仅值相同,id
也相同,它们将被一一处理,而不是全部处理,因此 id
会有所不同,但值仍然相同,因此并非全部相同,提到的内容确实导致了您的问题,*
并不总是最好的,range
才是最好的。
我是一名优秀的程序员,十分优秀!