python中list的清空方法的陷阱:[]和clear()

关于list清空中的[]和clear()的陷阱

今天在用python读取数据时遇到了一个关于list清空的问题,解决良久都没有效果,最后在断点调试时才发现,原来问题出在[]赋值和clear()函数的用法上的存在陷阱,也说明两种方法在使用上还是存在细微差别。

问题概述

我想从一个文本文件中读取数据,文本的数据样式为:
在这里插入图片描述
其中每一行代表一个样本数据,重点在于每一个样本数据的样式,比如第一行为3个字段,每个字段用tab键分割,在每个字段中再用空格符进行分割,则在python中的保存数据类型应该为[[[1573,1730,8392,0,689,7,2702],[96,1573,1730,8392],[[1]]]
后面每一行的数据也以这种形式依次插入,那么最后所得到的形式为:在这里插入图片描述
呈现形式为一个3维的数组。

陷阱所在

在代码上,采用通常的思路,不断的append,直到生成最大的这个3维数组。
在最刚开始的编写中,对于前两层的数组,在每次append之后,都采用的clear()函数来进行清除,防止append下一行数据的时候会保存着上一次的数据,造成数据冗杂且错误的形式,代码如下:

c_nums1=[]
c_nums2=[]
temp_1=[]
feats=[]
with open("train.txt") as f:
    for i in range(2):
        line=f.readline()
        temp = line.strip().split('\t')
        c_1 = temp[0].split(' ')
        c_2 = temp[1].split(' ')
        for i in c_1:
            c_nums1.append(float(i))
        for j in c_2:
            c_nums2.append(float(j))
        temp_1.append(c_nums1)
        temp_1.append(c_nums2)
        feats.append(temp_1)
        c_nums1.clear()
        c_nums2.clear()
        temp_1.clear()
f.close()
print(feats)

测试样例,只取了前两行作为测试,运行结果如下:
在这里插入图片描述
输出结果为两个空列表,明显错误,但是光看上面代码是没有错误的,苦于一直找不到哪里错误,就用断点调试来进行排错,然后可以明显的看到在clear()函数执行之后出现了没有想到的错误,如下:
在这里插入图片描述
可以看到在执行feats.append(temp_1)后,feats中是有值的,但在其后执行清除前两层数组的时候发现,feats的值也被清除了
在这里插入图片描述
所以这里推测,clear()函数像c里面的指针一样,在clear这个空间的时候,会将前面调用了这个空间的数值都清空,像是都连在一起的一样,将clear()函数改为用[]赋值就没有这个问题了,一切都能正常输出:
在这里插入图片描述
这个问题不大,但是值得注意,码在这里也是提醒着以后的自己要注意这些。

猜你喜欢

转载自blog.csdn.net/jiljdlawjdlada/article/details/105411352