關於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
