关于python list乘法的坑
关于python list乘法的坑
主要和python引用有关:
在python中使用List乘法可以构建重复元素,比如:
a = [1]*10
print(a)
a[0] = 10
print(a)
b = [{'a': 1}] * 10
print(b)
b[0]['a'] = 10
print(b)
结果是:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[10, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[{'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}]
[{'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}, {'a': 10}]
list存的是int没什么关系,但是当list里面是dict时就和想的不太一样了。
原因:
对Python列表使用乘法,对于不可变对象(如数字、字符串)而言是复制值,但对可变对象(如列表、字典)而言则是复制引用,因此对于包含可变对象的列表切莫使用列表乘法,可使用列表生成式代替。
所以上述的list里面,虽然只改变了其中1个列表中的字典元素,但是整个list的dict都跟着改变了。这就是因为10个dict指向了同一个dict对象的引用。
参考
【1】https://blog.csdn.net/wangxinginnlp/article/details/53201450