问题:使用data.append会在子循环结束后进行数据覆盖。
#查看内存
import random
def test():
return random.random()
def test1():
with open(savefilename, 'w') as write_file_handler: #打开要保存的.txt文件
for i in range(3):
data=[]
for i in range(2):
a = test()
data.append(a)
data.append('/n')
print('a_id=',id(a))
write_file_handler.writelines(data)
#out
a_id= 2566513744848
a_id= 2566513744872
a_id= 2566513744848
a_id= 2566513744872
a_id= 2566513744848
a_id= 2566513744872
可以看到对应生成6个值只得到了2个内存分配。输出值的话,也只能得到两个值。总结来说,Python是基于对象引用的,append添加的是一个“地址、引用”,当这个地址内的内容改变时,前面的同“地址”的内容都改变。
解决办法:
将data=[]放在循环之外。list定义在循环内,每次使用data.append(a)赋给list的都是相同的位置,而在同一位置的list的值已经改变了,所以list取到的之前位置的值改变了,表现出后面数据覆盖前面数据的表象。
参考博客:Python for 循环中使用append()添加可变元素,前面的值被覆盖,循环中内存应用地址不变 - 曙暮之光 - 博客园