python关于列表生成式的内存占用问题

今天爬虫遇到个很奇怪的问题,整个测试大致是这样的:

采用scrapy shell测试:
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" "https://book.douban.com/tag/"

# 代码一
from pyquery import PyQuery as pq
doc = pq(response.text)

aa = []
bb = []
for i in na:
    for item in doc(f'a[name="{i}"][class="tag-title-wrapper"]').items():
    # 测试一的写法,直接用aa得到生成式的结果,结果有缺失
        aa = [x.attr("href") for x in item.siblings(".tagCol").find("a").items()]
        #测试二的写法,用一个外面的列表得到结果,bb能得到想要的结果,但也存在疑问
        [bb.append(x.attr("href")) for x in item.siblings(".tagCol").find('a'.items())]

当爬取数据条目时,测试一的结果压根不是想要的结果,但是测试二的结果却是准确的结果。但同时测试二的结果在内存上让我不禁有些疑问:这样产生的结果虽然让bb接收到了,但是整个列表生成式本身也会产生一个结果,而致占用较大内存。因此我用了一个较简单的方法进行测试,如下:

# 代码二:
>>>a,b = [1,2,3],[4,5,6]
>>>x,y = [],[]
>>>x1 = [x.append(j) for i in zip(a,b) for j in i]
>>>x1
[None, None, None, None, None, None]
>>>x
[1, 4, 2, 5, 3, 6] # 是想要的结果
>>>y = [j for i in zip(a,b) for j in i]
>>>y
[1, 4, 2, 5, 3, 6] # 是想要的结果

分析和问题:
产生差别的原因,个人认为是因为append()方法没有返回值,所以遍历时每次都为None。但不理解的是:列表生成式生成的列表是否会占用内存?有什么更简单的方法(不通过append()方法)拿到列表生成式的结果吗
希望问题已经表述清楚,谢谢大佬们的解惑!

阅读 2.2k
1 个回答

aa = [x.attr("href") for x in item.siblings(".tagCol").find("a").items()]
你每次循环都把aa重新赋值 结果肯定缺失啊
aa = aa + [x.attr("href") for x in item.siblings(".tagCol").find("a").items()]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题