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

转自:http://blog.csdn.net/gavinxlf/article/details/52227967
list=[]

创建字典

dictionary={}

获取字典key值list(第一行)

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=[]

获取字典key值list(第一行)

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 深拷贝 拷贝对象及其子对象

你可能感兴趣的:(遇到的问题及解决办法)