在写公司web系统后台的时候,发现前端收到一个list的值是重复的,到后台看下代码,才想起一个深拷贝与浅拷贝的问题。
这个问题应该在初学python的时候会遇到,平时也要多注意检查自身的代码才行。
场景模拟:
a = []
b = {}
for i in range(0, 3):
b = {} #这个地方注释与否会有不同的结果
print i
print a
print b
b['a'] = i
a.append(b)
print a
print b
print a
原理:
dict(字典)赋给list的是一个位置,对于第一种代码,b定义在循环外,a.append(b)赋给a的都是相同的位置,而在同一位置的b的值已经改变了,所以a取到的之前位置的值改变了,表现出后面数据覆盖前面数据的表象。b定义在循环内,相当于每一次循环生成一个b占用不同的位置存储值,所以可以赋给a不同元素不同的位置,获得不同的值。
深拷贝与浅拷贝:
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。
区别:
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
2. copy.deepcopy 深拷贝 拷贝对象及其子对象