Streamlit切换菜单页面报UnboundLocalError: 'dados' referenced before assignment
错误原因
- Streamlit每触发一次用户交互操作(切换侧边栏选项、点击提交按钮等)都会重新执行完整的脚本代码,普通变量的状态会在脚本重运行后完全重置。
dados变量仅在「当前选中Home页且用户点击提交按钮」的逻辑分支中被定义,当你切换到Charts页时,该分支不会执行,dados变量未被创建,因此触发UnboundLocalError报错。- 你没有对跨页面需要复用的数据做持久化存储,Home页拉取到的股票数据在切换页面后就被销毁了,Charts页自然无法访问。
解决方案
使用Streamlit内置的st.session_state实现状态持久化,它可以在脚本多次重运行、页面切换时保留数据,修改步骤如下:
- 先在脚本开头初始化需要持久化的状态变量,避免访问不存在的key:
# 放在导入库之后、main函数定义之前即可 if 'dados' not in st.session_state: st.session_state.dados = pd.DataFrame()
- 修改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())
- 修改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
相关产品推荐
相关产品推荐

