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

VS Code运行Python CartPole游戏遇IndexError问题求助

CartPole代码在VS Code报错但Colab正常的原因

我在VS Code中运行Python实现的CartPole游戏代码时触发索引越界错误,但相同代码在Google Colab中可以正常运行并输出结果,想明确问题的原因。

运行代码

import gym

env = gym.make('CartPole-v1') # 创建环境

def basic_policy(obs): # 定义决策策略
    angle = obs[2]        # 获取杆子的角度
    return 0 if angle < 0 else 1

totals = [] # 存储每一轮的总奖励

for episode in range(10):
    episode_rewards = 0 # 当前轮次的奖励
    obs = env.reset() # 重置环境,获取初始观测
    action = 1 # 初始化动作(左/右移动)
    for step in range(1000): # 最多执行1000步
        action = basic_policy(obs) # 根据当前观测执行动作
        env.render() # 渲染游戏画面
        obs,reward,done,info = env.step(action) # 执行动作后获取新状态
        episode_rewards += reward # 累加奖励
        if done :
            totals.append(episode_rewards)
            break

print(totals)

print('杆子保持平衡的最长步数: ' + str(max(totals)))

VS Code中触发的错误

Traceback (most recent call last):
File "c:\Users\Admin\1BM22AD022\AI\file1.py", line 16, in
action = basic_policy(obs) # perform action based on obs
^^^^^^^^^^^^^^^^^
File "c:\Users\Admin\1BM22AD022\AI\file1.py", line 6, in basic_policy
angle = obs[2] #observing the pole angle in env

IndexError: tuple index out of range

Google Colab中的正常输出

[26.0, 60.0, 51.0, 40.0, 40.0, 24.0, 36.0, 41.0, 45.0, 49.0]
杆子保持平衡的最长步数: 60.0

问题原因

核心是Gym库版本不一致:

  • VS Code中安装的是Gym 0.26及以上的新版本,这类版本里env.reset()的返回值从单一的观测数组,改为了包含(observation, info)的元组(info是环境返回的额外信息字典)。代码直接用obs = env.reset()赋值后,obs变成了长度为2的元组,执行obs[2]自然会触发索引越界。
  • Google Colab默认安装的是Gym 0.25及以下的旧版本,这类版本中env.reset()仅返回长度为4的观测数组(对应小车位置、小车速度、杆子角度、杆子角速度),因此代码可以正常读取obs[2]获取杆子角度。

解决方法

有两种方案可选:

  1. 适配新版本Gym:修改env.reset()的赋值语句,忽略额外的info参数:
    obs, _ = env.reset()
    
  2. 统一Gym版本:在VS Code中安装和Colab相同的旧版本Gym,执行命令:
    pip install gym==0.25.2
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:20:17