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

Streamlit切换菜单页面报UnboundLocalError: 'dados' referenced before assignment

错误原因
  • Streamlit每触发一次用户交互操作(切换侧边栏选项、点击提交按钮等)都会重新执行完整的脚本代码,普通变量的状态会在脚本重运行后完全重置。
  • dados变量仅在「当前选中Home页且用户点击提交按钮」的逻辑分支中被定义,当你切换到Charts页时,该分支不会执行,dados变量未被创建,因此触发UnboundLocalError报错。
  • 你没有对跨页面需要复用的数据做持久化存储,Home页拉取到的股票数据在切换页面后就被销毁了,Charts页自然无法访问。
解决方案

使用Streamlit内置的st.session_state实现状态持久化,它可以在脚本多次重运行、页面切换时保留数据,修改步骤如下:

  1. 先在脚本开头初始化需要持久化的状态变量,避免访问不存在的key:
# 放在导入库之后、main函数定义之前即可
if 'dados' not in st.session_state:
    st.session_state.dados = pd.DataFrame()
  1. 修改Home页的提交逻辑,把拉取到的dados存入session_state:
if submit:
    dados = baixa_dados(df=carteira, tickers=ativos, start=start, end=end)
    st.session_state.dados = dados # 把数据存入持久化状态
    st.line_chart(dados.head())
  1. 修改Charts页的逻辑,从持久化状态中读取数据,同时加空值判断避免无数据时报错:
if choice == 'Charts':
    if st.session_state.dados.empty:
        st.warning("请先在Home页输入股票参数并提交")
    else:
        st.line_chart(st.session_state.dados)

如果需要避免缓存的旧数据影响使用,也可以同时把起始日期、股票代码等参数也存入st.session_state,切换到Charts页时如果参数存在且数据为空,自动触发拉取逻辑即可。

内容的提问来源于stack exchange,提问作者BeatrizGomes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:00:04