names = ["a", "b", 'c', 'd']
data = {}
a = []
for i in names:
data["name"] = i
a.append(data)
print(a)
--------------------------
结果:
[{'name': 'd'}, {'name': 'd'}, {'name': 'd'}, {'name': 'd'}]
原理分析:
dict(字典)赋给list的是一个位置,对于这种代码,
data定义在循环外,每次使用a.append(data)赋给 list的都是相同的位置,而在同一位置的dict的值已经改变了,所以list取到的之前位置的值改变了,表现出后面数据覆盖前面数据的表象。
dict定义在循环内,相当于每一次循环生成一个data,占用不同的位置存储值,所以可以赋给list不同元素不同的位置,获得不同的值。
深层次解释:
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。
- copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
- copy.deepcopy 深拷贝 拷贝对象及其子对象