-2

我的代码如下:

self.newMonsterList =[]
myKeys = []
if (len(self.myList)>0):
    for i in range(len(self.myList)-1):
        myVar = self.myList[i]
        myKeys.append(myVar[1])
        lis = game.active_entities.keys()
for k in lis:
    if (k not in myKeys):
        game.active_entities[k].destroy()
for it in self.myList:
    if (it[1] in lis):
        self.setEnt(it, game.active_entities[it[1]])
    else:
        self.newMonsterList.append(it)
self.makeEnt()

这段代码,也就是它所在的方法,在一个显然有效的 while 循环中被调用。makeEnt 将带有它[1] 的实体作为 key 附加到 self.newMonsterList。这行得通,我已经测试过了。因此,在所有这些代码(即调用此代码的 while 循环)的第一轮完整循环之后,newMonsterList 中的 ID 不应该在第二轮之后出现。然而,确实如此。另一方面,如果我在 makeEnt 中检查 newMonsterList 的内容是否已经是键,我会得到正确的结果。因此,我得出结论,在 while 循环的哪个运行中没有正确清空 newMonsterList。我现在一直在尝试不同版本的 2 小时……有人知道吗?

我试图把它写下来更简单:a 是一个 Ints 列表

d 是一个以整数为键的字典

While True:
   b=[]
   for it in a:
      if (it not in d):
         b.append(it)
         print it
      else:
         print it
    for k in b:
          d[k] = k

我现在发现,monsterlist 确实在每一轮都清空了,但是,在 ifclause ("if (it not in d):") 中,每轮都将 "it" 附加到列表中。但是,第一次迭代后,“它”也肯定在 d 中,我可以打印它。

4

1 回答 1

0

你知道这个循环迭代了self.myList,但跳过了列表中的最后一项,对吧?

myKeys = []
if (len(self.myList)>0):
    for i in range(len(self.myList)-1):
        myVar = self.myList[i]
        myKeys.append(myVar[1])
        lis = game.active_entities.keys()

跳过最后一项似乎很可疑。

仅供参考,我认为上面的代码相当于:

assert self.myList # Because if self.myList was empty, iterating over
                   # lis (later) would have caused an NameError.
myKeys = [value for key, value in self.myList[:-1]]
lis = game.active_entries.keys()
于 2013-02-23T17:33:02.967 回答