Python 关于列表方法append的一些新的认识

最近在学习python爬虫,需要将爬取到的数据写入excel文件中,其中,就需要用到列表进行数据的暂时存储,就会用到append()这个方法,具体我是想通过将一个房屋的相关信息放入到一个列表中,然后再通过循环的方式将这个列表作为一个参数通过append 添加到另一个列表中。在每次循环前,我想通过clear方法进行第一个列表的数据清除。然后就遇到了问题,发现之前存入第二个数组中的数据也没有了。

下面这个小例子就是上面我说的一个简版:

output_list = ['1','2','3','4']
output_list2=[]
output_list2.append(output_list)
print(output_list2,end="\n")
output_list.clear()
print(output_list2,end="\n")

输出结果:
[['1', '2', '3', '4']]
[[]]

嗯?这就产生了疑问 我将list作为整体,通过append方法添加到list2中,然后将list进行清空,再次输出list2的时候,发现里面没有值。
这是怎么回事呢?别着急,咱们进行如下的尝试。

output_list = ['1','2','3','4']
output_list2=[]
print(id(output_list))
output_list2.append(output_list)
print(output_list2,end="\n")
output_list.clear()
print(id(output_list))
print(output_list2,end="\n")

输出结果:
2507555808200
[['1', '2', '3', '4']]
2507555808200
[[]]

id()这个方法是输出变量所在的内存地址,从上面输出结果上来看,显而易见的,list1所在的内存地址是一样的,list2输出依旧第二次没有值。

本意想通过for循环进行将一个列表通过append添加到另一个列表中,形成类似二维数组的形式,所以想使用clear进行每次循环对list进行清除。接下来,咱们使用下面的方法进行尝试:

output_list = ['1','2','3','4']
output_list2=[]
print("list-1内存地址"+str(id(output_list)))
output_list2.append(output_list)
print(output_list2,end="\n")
output_list = []
print("list-2内存地址"+str(id(output_list)))
print(output_list2,end="\n")

输出结果:
list-1内存地址1437495862216
[['1', '2', '3', '4']]
list-2内存地址1437495862280
[['1', '2', '3', '4']]

结论:append()添加的变量,并不是直接将值复制给了第二个list,而是将该变量的内存地址进行了索引,当第一个list被clear()之后,该地址上没有值,所以,list2的列表里面也没有值。

解决方案
我将output_list=[] 与output_list.clear()进行替换,采用初始化一个名字相同的变量。通过输出显示,这个初始化的变量虽然与之前名字相同,但是存储的内存地址不同。这样做,会浪费一些内存资源,不过,问题得到了解决。

发布了48 篇原创文章 · 获赞 34 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/lzx159951/article/details/102989539