将元素添加到空列表会产生意外行为

时间:2019-08-02 13:19:22

标签: python

我正在pygame中玩一个小游戏,用于强化学习(openAI体育馆),但是遇到列表/字典问题。我认为这与所有指向同一内存地址的空列表有关,但在这种情况下我不理解为什么/如何或如何避免使用它。

最终,我希望能够使用空列表或字典,我试图通过其第二个元素(int3)将形式为((int1,int2),int3))的元组列表进行分组。

我尝试在初始化空数组时使用copy(),但没有区别。我没有从教程或文档页面中找到/理解任何有用的东西,因此,我将非常感谢您对如何避免此问题进行简要说明。

def works(t):
    lst = [[1],[2],[3]]
    lst[1].append([x for x in t if x[1]==1])
    return lst

def does_not_work(t):
    lst = 3*[list()]
    lst[1].append([x for x in t if x[1]==1])
    return lst

t = [(('a'), 0), (('b'), 1), (('c'), 1), (('d'),2)]
print('Expected Result:')
print(works(t))
print('Confusing Result:')
print(does_not_work(t))
Expected Result:
[[1], [2, [('b', 1), ('c', 1)]], [3]]
Confusing Result:
[[[('b', 1), ('c', 1)]], [[('b', 1), ('c', 1)]], [[('b', 1), ('c', 1)]]]

1 个答案:

答案 0 :(得分:4)

lst = 3*[list()]

这将创建3个对同一列表的引用。使用lst = [ [] for i in range(n) ]