之前python做题用到了二维List
l=[[3]*3]*4
但是,当我想将l[0][0]=0的时候,输出却变成了这样
查阅资料后发现list的浅拷贝问题,二维列表里面保存的是一维列表的地址,我这样赋值是把第一个[3]*3也就是[3,3,3]的地址复制了四遍,这个二位列表看似有了四个一维的[3,3,3],但是其实它们在内存里都是指向一个对象,所以之后修改任意一行的其中元素,其他行的对应位置元素也会被改变。
包括以下几种赋值方式都是浅拷贝:
1.l=[[3 for i in range(3)]]*4
2.l=[list(3 for i in range(3))]*4
3.l1=[3]*3
for i in range(4):
l.append(l1)
正确的方法如下:
l=[[3]*3 for i in range(3)]
l=[]
for i in range(4):
l.append([3]*3)
总的来说,就是要注意二位list中保存的是一维list的地址,创建二维list要注意里面不要将一个一维list的地址复制多次。
拓展:Python中的copy方法是浅拷贝,深拷贝需要使用deepcopy方法。