说明:
- 引用是将同一个对象贴上不同的标签,实际上相当于一个人有不同的名称。
- 浅拷贝是对对象的最顶层部分复制并创建一个新的对象(不过新对象中如果有可变对象的引用则受原拷贝对象的影响)
- 深拷贝是完全复制一份,并产生了一个新的对象,与原拷贝对象没有半毛钱关系。
情况一:
I = []
for i in range(10):
I.append({'num':i})
print(I)
结果:[{‘num’: 0}, {‘num’: 1}, {‘num’: 2}, {‘num’: 3}, {‘num’: 4}, {‘num’: 5}, {‘num’: 6}, {‘num’: 7}, {‘num’: 8}, {‘num’: 9}]
情况二:
I = []
a = {'num': 0}
for i in range(10):
a['num'] = i
I.append(a)
print(I)
结果:[{‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}, {‘num’: 9}]
原因是:字典是可变对象,在下方的 I.append(a)的操作中是把字典 a 的引用传到列表 l 中,当后续操作修改 a[‘num’]的值的时候,l 中的值也会跟着改变,相当于浅拷贝。
注意:对于原子类型的数据如:数字、字符等,没有拷贝一说,产生的都是应用,因为它在内存是固定好地址分配的。