[1]*3是生成[1,1,1]的列表,
列表 * 数值是把列表中的元素重复数值的次数
但要注意这里列表中的1是数值属于不可变类型,这样没什么问题
之后*4是把这个列表重复4次
等于是a = [[1,1,1]] * 4
因为列表是按地址传递的,当把同一个列表多次添加到另一个列表中时,列表中每个子列表都是同一个地址。
改变其中一个子列表的属性,列表中所有子列表都会一起改变。
这个和a生成方式有关, 这种方式, a是有4个一样地址的子列表组成的二维列表
从图可以看出 a[0] , a[1],a[2],a[3] 的地址都一样 , 修改任何一个, 4个列表会一起修改。
1、原因
这里考查的是,数组的浅拷贝问题
a=[[1]*3]*4,这样的写法,会导致浅拷贝,就是所有的二级元素都共享同一个数组(地址相同)
所以,当其中一个二级元素修改,其他值也会跟着修改
2、解决方法
使用另一个写法:a = [([0] * 3) for p in range(3)]
#python 2.7.12
a = [([0] * 3) for p in range(3)]
a[1][2]=6
print a