关于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

【2】https://blog.csdn.net/Blateyang/article/details/90179084

posted @ 2020-12-05 16:09  Molinchn  阅读(1387)  评论(0编辑  收藏  举报