Skip to content

建立 2026-09-14 更新 2026-09-14

Session State

st.session_state 像一本跟「這個使用者、這次瀏覽」綁在一起的字典。重新整理網頁會清空;另一個使用者看不到你的內容。

一定要先初始化

import streamlit as st

if "counter" not in st.session_state:
    st.session_state.counter = 0

if st.button("加一"):
    st.session_state.counter += 1

st.write("目前次數:", st.session_state.counter)

漏掉 if ... not in 就會每次重跑都設回 0,看起來像按鈕壞掉。

Widget 與 key

key 的 Widget 會自動把值寫進 Session State。Callback 則用來在重跑前同步兩個 Widget,例如公斤/磅換算。官方工程師的逐步示範見 Session State 影片

def lbs_to_kg():
    st.session_state.kg = st.session_state.lbs / 2.2

st.number_input("磅", key="lbs", on_change=lbs_to_kg)
st.number_input("公斤", key="kg")

什麼時候用它?

  • 計數器、多步驟精靈、wizard
  • 聊天訊息清單
  • 登入後記住使用者
  • 跨頁分享目前選取的列或篩選條件

不要用它取代快取:讀 500 MB CSV 應走 @st.cache_data,不是塞進 Session State 複製一份給每個使用者。