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

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

 

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值