python 使用list.append()后前面的数据被后面的数据覆盖-解决办法

list=[]
#创建字典
dictionary={}
#获取字典keylist(第一行)
keylist = table.row_values(0, 0, ncols)
#excel数据放到字典中
for rownum in range(1,nrows):
    for colnum in range(ncols):
        dictionary[keylist[colnum]] = table.cell(rownum, colnum).value
    print dictionary
    list.append(dictionary)
    print list
print list
上面获得的数据是{A1,A1}类型的数据

修改代码(正确代码)
list=[]
#获取字典keylist(第一行)
keylist = table.row_values(0, 0, ncols)
#excel数据放到字典中
for rownum in range(1,nrows):
    # 创建字典
    dictionary = {}
    for colnum in range(ncols):
        dictionary[keylist[colnum]] = table.cell(rownum, colnum).value
    # print dictionary
    list.append(dictionary)
    print list
print list
得到数据{A1,A2}

原理分析:
	dict(字典)赋给list的是一个位置,对于第一种代码,dictionary定义在循环外,每次使用list.append(dictionary)赋给  list的都是相同的位置,而在同一位置的dict的值已经改变了,所以list取到的之前位置的值改变了,表现出后面数据覆盖前面数据的表象。dict定义在循环内,相当于每一次循环生成一个dictionary,占用不同的位置存储值,所以可以赋给list不同元素不同的位置,获得不同的值。
深层次解释:
	Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。
                 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 
                 2. copy.deepcopy 深拷贝 拷贝对象及其子对象
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值