4 回答
TA贡献1816条经验 获得超6个赞
您需要创建一个新的元组“详细信息”列表。在 Python 中,您通常无法“就地”更改列表。如果您只是在 for 循环中创建一个新的“详细信息”,它将不会传递到“详细信息”列表。
因此,您需要用for detail in details:
以下行替换完整的循环:
updated_details = [(user, VoteChoice, Comments, User.query.filter_by(name=user).first().fb_pic) for (user, VoteChoice, Comments) in details]
最后,您将这些更新的详细信息用于返回的 render_template:
return render_template(..., vote_details=updated_details)
TA贡献1995条经验 获得超2个赞
元组是不可变的,因此您不能直接修改它们。
在您的 for 循环中,从原始detail元组中创建一个列表,并将附加值附加到该列表中。然后,您可以将列表转换回元组:
detail_list = list(detail)
detail_list += [maybe_existing_user.fb_pic]
detail = tuple(detail_list)
TA贡献1799条经验 获得超6个赞
使用 splat 操作符在一行中重新打包
detail_list = *detail_list, maybe_existing_user.fb_pic
例如,在 python3 shell 中:
>>> detail_list = ("cat", "dog")
>>> detail_list = *detail_list, "rabbit"
>>> detail_list
('cat', 'dog', 'rabbit')
>>>
TA贡献1812条经验 获得超5个赞
您已经正确添加到元组中。问题是detail += ...创建一个新元组而不是附加到details列表中的现有元组(因为元组是不可变的)。当您print(detail)在循环中时,它似乎已正确更改,但如果您要打印整个列表details,您会看到其中的元组没有附加信息。
一种解决方案是使用新元组重建详细信息列表。
def add_more_info(t):
maybe_existing_user = User.query.filter_by(name=detail[0]).first()
return t + (maybe_existing_user, )
details = [add_more_info(detail) for detail in details]
另一种解决方案是首先将所有详细信息转换为列表。然后你可以附加到它们。
details = [list(detail) for detail in details]
for detail in details:
maybe_existing_user = User.query.filter_by(name=detail[0]).first()
detail.append(maybe_existing_user)
添加回答
举报