在for循环里用list.append()方法, 最终的list只保留最后一次循环的结果的解决和思考 您所在的位置:网站首页 python遍历元素就空了 在for循环里用list.append()方法, 最终的list只保留最后一次循环的结果的解决和思考

在for循环里用list.append()方法, 最终的list只保留最后一次循环的结果的解决和思考

2024-06-05 06:55| 来源: 网络整理| 查看: 265

交代下写代码的背景:测试的项目需要大量造数据,想用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))

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有