今天在写Django小案例时发现:一个循环的问题,居然发现跟深拷贝有关联,下面是循环的代码:
car_list=[<CarDetail: 黑色>, <CarDetail: 白色>, <CarDetail: 绿色>]
carstyle_list=[<CarStyle: 三厢>, <CarStyle: 两厢>]
json_list4=[]
json_list5={}
for car in car_list:
json_list5['brande']=car.brande.name
json_list5['age']=str(car.age)
json_list5['mileage']=str(car.mileage)
json_list5['car_price']=str(car.car_price)
json_list5['status']=str(car.status)
for carstyle in carstyle_list:
if carstyle.name == car.style.name:
json_list5['image']=carstyle.image.name
json_list4.append(json_list5)
print(json_list4)
结果居然变成了三个同样的数据的结果如下:
[{'brande': '福特', 'status': '1', 'car_price': '5.120', 'image': 'static/style/1.jpg', 'age': '2', 'mileage': '1.22'}, {'brande': '福特', 'status': '1', 'car_price': '5.120', 'image': 'static/style/1.jpg', 'age': '2', 'mileage': '1.22'}, {'brande': '福特', 'status': '1', 'car_price': '5.120', 'image': 'static/style/1.jpg', 'age': '2', 'mileage': '1.22'}]
试了多次终于发现,原来这跟深拷贝有关,之前是因为append()等于一直指向引用json_list5,所以一直等到循环json_list5
最后的修改状态,json_list4列表中的三个值指向最后json_list5的状态,所以出现上面三个值相同的情况,未避免发生这种情况,于是我把引用json_list5的地址,改为拷贝值,也就是进行深拷贝,就完全改变了三个值的情况,代码如下:
for car in car_list:
json_list5['brande']=car.brande.name
json_list5['age']=str(car.age)
json_list5['mileage']=str(car.mileage)
json_list5['car_price']=str(car.car_price)
json_list5['status']=str(car.status)
for carstyle in carstyle_list:
if carstyle.name == car.style.name:
json_list5['image']=carstyle.image.name
import copy
b=copy.deepcopy(json_list5)
print(json_list5)
print(json_list4)
json_list4.append(b)
print(json_list4)
最终得到想要的结果:
[{'age': '2', 'status': '1', 'mileage': '3.50', 'brande': '福特', 'car_price': '7.800', 'image': 'static/style/1_JukMMgd.jpg'}, {'age': '1', 'status': '1', 'mileage': '2.00', 'brande': '奥迪', 'car_price': '6.000', 'image': 'static/style/1_JukMMgd.jpg'}, {'age': '2', 'status': '1', 'mileage': '1.22', 'brande': '福特', 'car_price': '5.120', 'image': 'static/style/1.jpg'}]