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 envIndexError: 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]获取杆子角度。
解决方法
有两种方案可选:
- 适配新版本Gym:修改
env.reset()的赋值语句,忽略额外的info参数:obs, _ = env.reset() - 统一Gym版本:在VS Code中安装和Colab相同的旧版本Gym,执行命令:
pip install gym==0.25.2
内容的提问来源于stack exchange,提问作者Harshvardhan Singh
相关产品推荐
相关产品推荐

