You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit中无法累加存储多次输入的session_state值问题

解决Streamlit中历史输入值持久化存储的问题

问题核心是你定义的store是普通局部变量,Streamlit每次交互都会重新运行整个脚本,导致store被反复初始化为空列表,无法保留历史数据。必须把存储列表放到st.session_state中实现持久化,同时要注意避免直接引用session_state的原始数据(防止后续修改覆盖已存储的历史)。

修正后的完整代码

import streamlit as st

# 初始化session_state中的存储列表,首次运行时创建空列表
if "store" not in st.session_state:
    st.session_state["store"] = []
# 初始化输入字段的session_state键,避免KeyError
if "x" not in st.session_state:
    st.session_state["x"] = ""
if "y" not in st.session_state:
    st.session_state["y"] = ""

# 创建输入字段,绑定到session_state
st.text_input("输入x的值", key="x")
st.text_area("输入y的值", key="y")

# 提交按钮:将当前输入值存入历史
if st.button("提交并保存"):
    # 复制当前输入值的快照,避免后续修改session_state影响历史数据
    current_input = [["x", st.session_state["x"]], ["y", st.session_state["y"]]]
    st.session_state["store"].append(current_input)
    st.success("已保存当前输入!")

# 清空按钮:重置输入框,不影响历史存储
if st.button("清空输入"):
    st.session_state["x"] = ""
    st.session_state["y"] = ""

# 展示历史存储的数据
st.subheader("历史输入记录")
if st.session_state["store"]:
    for idx, record in enumerate(st.session_state["store"], 1):
        st.write(f"第{idx}次输入: {dict(record)}")
else:
    st.write("暂无历史记录")

# 打印store的结构(调试用)
st.subheader("Store结构")
st.write(st.session_state["store"])

关键说明

  1. 持久化存储:把store放到st.session_state中,Streamlit会在交互之间保留这个变量,不会每次运行脚本都重置。
  2. 数据快照:提交时创建current_input作为当前输入的副本,而不是直接append(list(st.session_state.items()))——因为st.session_state.items()返回的是动态引用,后续修改输入值会改变已存入历史的数据,复制快照能保证历史数据的独立性。
  3. 输入字段初始化:提前初始化x和y的session_state键,防止首次运行时出现KeyError。

运行这段代码后,每次点击「提交并保存」都会把当前输入值追加到历史列表,多次提交后store会得到你期望的嵌套列表结构,清空输入只会重置输入框,不会影响已存储的历史数据。

内容的提问来源于stack exchange,提问作者Teja Sruthi Varanasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:31:00