python List乘法 注意事项

List的确可以使用乘法:
如下:

a =[0]*4
print(a)
a[1]=1
print(a)
#结果:
#[0, 0, 0, 0]
#[0, 1, 0, 0]

但是当使用list里嵌套一个字典的时候:

a1 =[{"a" : 1}]*4
a1[1]["a"]=2
print(a1)
#结果:
#[{'a': 2}, {'a': 2}, {'a': 2}, {'a': 2}]

我们可以看到,这里列表里所有元素的值都改变了!
*操作符在实现上是复制了值的引用,而不是创建了新的对象。所以上述的list里面,是4个指向同一个dict对象的引用。
*操作符对于不可变对象(比如int值)很安全,但对于可变对象(字典),可能就不是你期望的结果了。因为不可变对象是复制值,而可变对象是复制引用。
所以这里我们最好使用另一种方法达到这个效果:

a1 =[{"a" : 1}]*4
b1 =[{"a" : 1} for _ in range(4)]#_也可以是i之类的。。。反正是个临时变量
a1[1]["a"]=2
b1[1]["a"]=2
print(a1)
print(b1)
#结果
#[{'a': 2}, {'a': 2}, {'a': 2}, {'a': 2}]
#[{'a': 1}, {'a': 2}, {'a': 1}, {'a': 1}]

你可能感兴趣的:(python List乘法 注意事项)