先來看一段代碼:
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
兩次的輸出結(jié)果一樣么?
不一樣的。
輸出如下:
[[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的列表類型傳遞的都是引用,這里要多注意。