Python游戏训练数据二维列表更新异常问题求助
二维列表更新异常:所有元素被覆盖为最新值的解决方法
问题根源是Python列表的引用特性:你始终在复用同一个tlistc列表对象,每次循环只是修改它的内容,然后将这个对象的引用赋值给tlistm的元素。这导致tlistm里的所有元素其实都指向同一个列表,最终所有元素都会显示成最后一次修改后的tlistc内容。
问题代码中的关键错误
- 没有每次循环创建新的列表实例,一直修改同一个
tlistc tlistm.append('a')再tlistm[e] = tlistc的操作完全多余,且会引发引用问题
修正后的代码
for e in range(episodes): qm = random.randint(0,5) env.game(action) fps.tick(1) screen.fill(bgcolor) s = env.get_state() rew = s[12] q1 = rew + g * qm # 每次循环创建全新的列表,而非复用旧列表 tlistc = [] for k in range(12): tlistc.append(s[k]) tlistc.append(action) tlistc.append(q1) # 直接将新列表添加到tlistm tlistm.append(tlistc) if s[13] == 1: env.game_reset() action = random.randint(0,3) print(tlistm)
更简洁的写法(用列表推导式)
for e in range(episodes): qm = random.randint(0,5) env.game(action) fps.tick(1) screen.fill(bgcolor) s = env.get_state() rew = s[12] q1 = rew + g * qm # 一行构建新列表,避免手动循环添加 tlistc = [s[k] for k in range(12)] + [action, q1] tlistm.append(tlistc) if s[13] == 1: env.game_reset() action = random.randint(0,3) print(tlistm)
修正逻辑说明
每次循环都创建一个全新的tlistc列表对象,添加到tlistm中的是不同的对象引用。后续修改新的tlistc时,不会影响之前已经存入tlistm的列表,这样就能保证每个元素都是独立的训练数据项。
内容的提问来源于stack exchange,提问作者Hanging logic
相关产品推荐
相关产品推荐

