交代下写代码的背景:测试的项目需要大量造数据,想用python脚本实现:举个栗子:
我需要在L列表中,插入n个字典,第一个参数需要变化,第二个参数不变。
我的想法:①让序列号递增;②赋值:value = 递增的序列,产生新的字典;③L列表添加新的字典。
于是,码代码:
l = [{'序列号':123456,'二':"百度云"}]
start = {'序列号':123456,'二':"百度云"}
def add_data(number):
for i in range(number):
start["序列号"] +=1
print(start["序列号"])
l.append(start)
print('list', l)
print('last_list', l)
return (l)
add_data(4)
运行后发现一个问题:生成的字典的值,没有保留之前的,结果是最后一次生成的数值
123457
list [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123457}]
123458
list [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123458}, {'二': '百度云', '序列号': 123458}]
123459
list [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123459}, {'二': '百度云', '序列号': 123459}, {'二': '百度云', '序列号': 123459}]
123460
list [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123460}, {'二': '百度云', '序列号': 123460}, {'二': '百度云', '序列号': 123460}, {'二': '百度云', '序列号': 123460}]
last_list [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123460}, {'二': '百度云', '序列号': 123460}, {'二': '百度云', '序列号': 123460}, {'二': '百度云', '序列号': 123460}]
经过各种尝试,修改代码,将一段代码写在里面,且把变量写在里面,如下:
{'序列号': vary_new_item,
'二': "百度云"}
最终可以跑通:
"""修改后的结果"""
l = [{'序列号':123456,'二':"百度云"}]
start = {'序列号':123456,'二':"百度云"}
def add_data_new(number):
vary_new_item = start["序列号"]
for i in range(number):
vary_new_item += 1
new_item= {'序列号': vary_new_item,
'二': "百度云"}
l.append(new_item)
print('modify_l',l)
print(l)
return l
add_data_new(3)
跑出的结果
modify_l [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123457}]
modify_l [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123457}, {'二': '百度云', '序列号': 123458}]
modify_l [{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123457}, {'二': '百度云', '序列号': 123458}, {'二': '百度云', '序列号': 123459}]
[{'二': '百度云', '序列号': 123456}, {'二': '百度云', '序列号': 123457}, {'二': '百度云', '序列号': 123458}, {'二': '百度云', '序列号': 123459}]
虽然最后得到了想要的结果,但是心中充满疑惑,第一种方法不行呢?
找了各种资料,终于知道惹:
简单说:
方法一:虽然改变了value值,但是内存指针仍旧指向同一个内存地址,只是对内容不停的修改(形象地:在一块地上,种李子,不喜欢,挖掉,重新种了西瓜,还是不喜欢,挖了,重新种了桃子,最后,在这块地上,只有得到桃子,是得不到李子,西瓜的)
方法二:将需要变的字典写在循环里,就相当于每次循环申请了一个地址,把更新的值放进去(就好比:自己在山上开辟了另外2块地,一块地种西瓜,一块地李子,最后桃子,李子,西瓜都可以收获)
这是我的一点浅薄见解,有不准确的地方,欢迎指正。
【2019/03/27补充】:为了提高代码的复用性,优化了代码,,使用了deepcopy()函数:
import copy
"""优化代码后的结果"""
l = [{'序列号': 123456, '二': "百度云"}]
start = l[0]['序列号']
def add_data_new(number):
n = []
for idx in range(number):
new = copy.deepcopy(l[0])
new_num = int(start)+(idx+1)
new['序列号'] = new_num
l.append(new)
return l
if __name__ == '__main__':
print(add_data_new(3))