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

如何在while循环中替换列表旧元素?WebSocket单价格存储实现

解决WebSocket价格列表只保留最新元素的问题

嘿,我明白你的问题了!你现在通过Binance的WebSocket获取实时价格,每次收到消息都用append()把新价格加到res_array里,结果列表越变越长,但你其实只想保留最新的那一个价格,用新值替换旧值。这就给你几个简单的解决方案:

方案1:直接重新赋值列表(最直观)

既然你只需要一个元素,每次收到新价格时直接把列表设为只包含这个新值就行,旧的元素会自动被丢弃:

res_array = []
bm = None
count = 0  # 假设你之前定义了count变量

def process_message(msg):
    global count, res_array, bm
    # 替换成仅包含最新价格的列表,而不是追加
    res_array = [msg['c']]
    return res_array

def initiate():
    global bm
    client = Client(api_key="11111111", api_secret="22222222")
    bm = BinanceSocketManager(client)
    # 这里补充启动socket的代码,比如监听指定交易对的实时价格
    # bm.start_symbol_ticker_socket(symbol="BTCUSDT", callback=process_message)

方案2:保持列表引用不变(适合其他地方依赖该列表对象的情况)

如果你的代码里还有其他地方引用了res_array这个列表对象,不想改变它的引用,就用索引替换第一个元素:

res_array = []
bm = None
count = 0

def process_message(msg):
    global count, res_array, bm
    if not res_array:
        # 第一次收到消息时,先添加第一个元素
        res_array.append(msg['c'])
    else:
        # 后续消息直接替换第一个元素
        res_array[0] = msg['c']
    return res_array

def initiate():
    global bm
    client = Client(api_key="11111111", api_secret="22222222")
    bm = BinanceSocketManager(client)
    # 启动socket监听

方案3:用单个变量代替列表(更高效)

其实你只需要存储一个价格值,根本没必要用列表,直接用单个变量会更简洁高效:

current_price = None  # 用单个变量存储最新价格
bm = None
count = 0

def process_message(msg):
    global count, current_price, bm
    current_price = msg['c']
    return current_price

def initiate():
    global bm
    client = Client(api_key="11111111", api_secret="22222222")
    bm = BinanceSocketManager(client)
    # 启动socket监听

小提醒

注意global关键字的使用,确保函数内外的变量是同一个引用,避免出现变量隔离的问题。另外,记得在initiate()里补充启动WebSocket监听的代码,否则不会有消息进来哦~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:21