在for循环里用list.append()方法, 最终的list只保留最后一次循环的结果的解决和思考
交代下写代码的背景:测试的项目需要大量造数据,想用python脚本实现:举个栗子:
我需要在L列表中,插入n个字典,第一个参数需要变化,第二个参数不变。
我的想法:①让序列号递增;②赋值:value = 递增的序列,产生新的字典;③L列表添加新的字典。
于是,码代码:
l = [{'序列号':123456,'二':"百度云"}]
start = {'序列号':123456,'二':"百度云"}def add_data(number):for i in range(number):start["序列号"] +=1print(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 += 1new_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_numl.append(new)return lif __name__ == '__main__':print(add_data_new(3))
在for循环里用list.append()方法, 最终的list只保留最后一次循环的结果的解决和思考
交代下写代码的背景:测试的项目需要大量造数据,想用python脚本实现:举个栗子:
我需要在L列表中,插入n个字典,第一个参数需要变化,第二个参数不变。
我的想法:①让序列号递增;②赋值:value = 递增的序列,产生新的字典;③L列表添加新的字典。
于是,码代码:
l = [{'序列号':123456,'二':"百度云"}]
start = {'序列号':123456,'二':"百度云"}def add_data(number):for i in range(number):start["序列号"] +=1print(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 += 1new_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_numl.append(new)return lif __name__ == '__main__':print(add_data_new(3))
发布评论