Python嵌套列表循环问题:所有子列表被最后URL评论覆盖
解决嵌套列表被最后一个URL评论覆盖的问题
嘿,我看你遇到了个挺典型的Python列表引用问题——本来想让每个子列表对应不同URL的前10条评论,结果所有子列表都被最后一个URL的评论给覆盖了对吧?我仔细看了你写的两种代码,问题根源出在列表初始化的方式上。
问题原因
你用的这两种初始化方式:
z = [[""] * 10] * len(x) # 或者 z = [[]] * len(x)
都会创建引用同一个底层列表对象的多个元素。简单说,z里的每个子列表其实都是同一个列表的“替身”,你修改任何一个z[i]的时候,都是在修改那个唯一的底层列表,最后所有子列表自然都会变成最后一次赋值的内容。
解决方案:创建独立的子列表
我们需要用列表推导式来初始化,这样每个子列表都是完全独立的对象,不会互相干扰。
对应第一种写法的修正代码
把列表初始化的那行改成列表推导式:
import praw reddit = praw.Reddit(client_id='L685-1uBBrLbKQ', client_secret='_Fk5nW1L2h3VRR6BVnkusMh43QQ_gg', user_agent='Shivam Anand') hot_posts = reddit.subreddit('AskReddit').top(time_filter="day", limit=5) x=[] y=[] for post in hot_posts: x.append(post.title) y.append(post.url) print(x) print(y) # 用列表推导式创建10个元素的独立子列表 z = [[""] * 10 for _ in range(len(x))] for i,j in enumerate(y): print(i) print(j) submission = reddit.submission(url=j) submission.comments.replace_more(limit=0) for commentcount in range(0, 10): print(commentcount) z[i][commentcount] = submission.comments[commentcount].body del submission
对应第二种写法的修正代码
同样把初始化改成列表推导式,生成独立的空列表:
import praw reddit = praw.Reddit(client_id='L685-1uBBrLbKQ', client_secret='_Fk5nW1L2h3VRR6BVnkusMh43QQ_gg', user_agent='Shivam Anand') hot_posts = reddit.subreddit('AskReddit').top(time_filter="day", limit=5) x=[] y=[] for post in hot_posts: x.append(post.title) y.append(post.url) print(x) print(y) # 用列表推导式创建独立的空列表 z = [[] for _ in range(len(x))] for i,j in enumerate(y): print(i) print(j) try: del submission except: print("na") submission = reddit.submission(url=j) submission.comments.replace_more(limit=0) for commentcount in range(0, 10): print(commentcount) print(j) z[i].append(submission.comments[commentcount].body)
这样修改后,每个子列表都会对应各自URL的评论,不会再被最后一个覆盖啦~
内容的提问来源于stack exchange,提问作者Shivam Anand
相关产品推荐
相关产品推荐

