#!/usr/bin/python
# -*-coding:utf-8 -*-
import random
class demo(object):
def __init__(self):
self.arr1 = []
self.demo_list = ['第一个','第二个']
self.arrfwPlaintiff = {"fwName": "", "fwAddress": "", "fwCardId": "", "fwPhone": "", "fwLitigantType2": ""}
def arr(self):
for i in range(2):
self.arr1.append(self.arrfwPlaintiff)
#self.arr1.append({"fwName": "", "fwAddress": "", "fwCardId": "", "fwPhone": "", "fwLitigantType2": ""})
return self.arr1
def getValue(self):
self.arr()
for key,val in enumerate(self.arr1):
self.arr1[key]['fwName'] = self.demo_list[key]
self.arr1[key]['fwLitigantType2'] = key
print(self.arr1)
if __name__ == '__main__':
demo().getValue()
为什么使用
self.arr1.append(self.arrfwPlaintiff) 两个'fwName': 的值都是 self.demo_list 的 '第二个',
结果错误:
[{'fwName': '第二个', 'fwAddress': '', 'fwCardId': '', 'fwPhone': '', 'fwLitigantType2': 1}, {'fwName': '第二个', 'fwAddress': '', 'fwCardId': '', 'fwPhone': '', 'fwLitigantType2': 1}]
而写死的
self.arr1.append({"fwName": "", "fwAddress": "", "fwCardId": "", "fwPhone": "", "fwLitigantType2": ""})
结果正确:
[{'fwName': '第一个', 'fwAddress': '', 'fwCardId': '', 'fwPhone': '', 'fwLitigantType2': 0}, {'fwName': '第二个', 'fwAddress': '', 'fwCardId': '', 'fwPhone': '', 'fwLitigantType2': 1}]
因为self.arr1.append(self.arrfwPlaintiff)的self.arrfwPlaintiff为同一个对象(地址相同),仅保留最后一次的修改结果
这里面的是有一点,用代码里面话术说,跟深拷贝和浅拷贝有关系,你这个添加的就是同一个变量,索引位置都没变,所以后面更改的时候会一起更改,因为两者的位置都是一样的,你写死是因为,再次循环后位置发生改变了,是完全不同的对象,所以第二次更改不会把前面的变了,可以百度搜下深拷贝和浅拷贝的关系,如果不想写死,两种方法,把self.arrfwPlaintiff这个写到for循环里面,这样就可以了,第二种,使用deepcopy深拷贝复制一个放入for循环,也可以