先来看一段代码:
class Solution:
def mark1(self, r, l):
mark = []
for i in range(r):
mark.append([True] * l)
return mark
def mark2(self, r, l):
mark = []
ls = [True] * l
for i in range(r):
mark.append(ls)
return mark
if __name__ == '__main__':
s = Solution()
mark1 = s.mark1(3, 3)
print mark1
mark1[2][1] = False
print mark1
mark2 = s.mark2(3, 3)
print mark2
mark2[2][1] = False
print mark2
两次的输出结果一样么?
不一样的。
输出如下:
[[True, True, True], [True, True, True], [True, True, True]]
[[True, True, True], [True, True, True], [True, False, True]]
[[True, True, True], [True, True, True], [True, True, True]]
[[True, False, True], [True, False, True], [True, False, True]]
可以看到 mark2 出问题了,明明更改的是 mark[2][1],mark[0][1] 和 mark[1][1] 也改变了,问题出在mark2的
ls = [True] * l
for i in range(r):
mark.append(ls)
也就是三行都是同一个对象,所以在更改的时候一起更改了。
Python的列表类型传递的都是引用,这里要多注意。