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

gym环境step方法报错ValueError:解包值数量不符求助

CartPole-v0中env.step()解包报错:ValueError: too many values to unpack (expected 4)

问题情况

运行CartPole-v0强化学习教程代码时,执行n_state, reward, done, info = env.step(action)行出现ValueError: too many values to unpack (expected 4)错误,教程视频中代码可正常运行,但本地执行始终报错。

执行代码

episodes = 10
for episode in range(1, episodes+1):
    state = env.reset()
    done = False
    score = 0 
    
    while not done:
        env.render()
        action = random.choice([0,1])
        n_state, reward, done, info = env.step(action)
        score+=reward
    print('Episode:{} Score:{}'.format(episode, score))

报错栈

ValueError                                Traceback (most recent call last)
Cell In[51], line 10
      8     env.render()
      9     action = random.choice([0,1])
---> 10     n_state, reward, done, info = env.step(action)
     11     score+=reward
     12 print('Episode:{} Score:{}'.format(episode, score))

ValueError: too many values to unpack (expected 4)

导入库及环境初始化代码

import os
import gym
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.evaluation import evaluate_policy
environment_name = "CartPole-v0"
env = gym.make(environment_name)

解决方案

这个错误是Gym版本差异导致的:

  • 旧版Gym(0.25及以下)中,env.step()返回4个值:(observation, reward, done, info)
  • 新版Gym(0.26及以上)中,API更新,将原done拆分为terminated(环境正常终止)和truncated(因步数限制等被截断),返回5个值:(observation, reward, terminated, truncated, info)

方法1:适配新版Gym

直接修改解包逻辑,合并terminated和truncated为原逻辑中的done:

episodes = 10
for episode in range(1, episodes+1):
    state = env.reset()
    done = False
    score = 0 
    
    while not done:
        env.render()
        action = random.choice([0,1])
        # 修改解包行,合并terminated和truncated为done
        n_state, reward, terminated, truncated, info = env.step(action)
        done = terminated or truncated
        score+=reward
    print('Episode:{} Score:{}'.format(episode, score))

方法2:兼容新旧版本

如果需要代码同时适配新旧Gym版本,可以通过判断返回值长度处理:

episodes = 10
for episode in range(1, episodes+1):
    state = env.reset()
    done = False
    score = 0 
    
    while not done:
        env.render()
        action = random.choice([0,1])
        step_result = env.step(action)
        if len(step_result) == 5:
            n_state, reward, terminated, truncated, info = step_result
            done = terminated or truncated
        else:
            n_state, reward, done, info = step_result
        score+=reward
    print('Episode:{} Score:{}'.format(episode, score))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:25:02