我正在努力弄清楚这里出了什么问题我试图将这个列表附加到字典键的列表中,但我只得到最后一个。
例如:
pastmoves =['n','w','s','w']
moves = [1,0,1,0]
turnpt = {'pos' : [],
'moves' : [],
'lastmove' : []}
pos = [1,1]
opt = [1]
while 5 not in opt:
if len(pastmoves) > 1:
if moves.count(1) > 1:
if pos not in turnpt['pos']:
turnpt['pos'].append(pos)
print(turnpt['pos'])
pos[1] += 1
print(pos)
opt[0] += 1
else:
print(opt)
我的标准写着:
[[1, 1]]
[1, 2]
[1, 3]
[1, 4]
[1, 5]
[5]
我希望pos
的每个版本都附加到turnpt['pos']
列表中,但这不会发生,为什么会这样?
注意:
我的if逻辑是嵌套的,因为我需要在每个之间完成其他操作,这只是一个有效的例子。
答案 0 :(得分:1)
使用pos
传递列表pos[:]
的副本。当您添加pos
然后更改它时,它也会在turnpt
中更改,因为它是对列表的引用,您的条件永远不会是True
。
while 5 not in opt:
if len(pastmoves) > 1:
if moves.count(1) > 1:
if pos not in turnpt['pos']:
turnpt['pos'].append(pos[:])
print(turnpt['pos'])
答案 1 :(得分:0)
你的问题在
if pos not in turnpt['pos']:
turnpt['pos'].append(pos)
你检查pos是否不在[' pos']中,然后你追加它,所以在那之后pos不是[' pos']永远不是真的。举例说明:
a = [1,1]
b = [[1,1]]
c = [a]
a in b == True
a in c == True
a[0] = 2
a in b = False
a in c == True
如果附加pos的副本,则表示您有预期的行为:
turnpt['pos'].append(pos[:])
或者,如果pos之后永远不会改变,那么使用元组代替
是一个很好的做法turnpt['pos'].append(tuple(pos))