-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 は、self.newMonsterList の Key として it[1] を持つエンティティを追加します。これは機能します、私はそれをテストしました。したがって、このすべてのコード (つまり、このコードを呼び出す while ループ) の最初の完全なラウンドの後に newMonsterList にある ID は、2 番目の後にそこにあるべきではありません。しかし、そうです。一方、newMonsterList の内容が既にキーであるかどうかを makeEnt でチェックすると、正しい結果が得られます。したがって、newMonsterList は while ループのどの実行で適切に空にされていないと結論付けます。私は今、2 時間の異なるバージョンを試しています....誰かがアイデアを得ましたか?

私はそれをもっと簡単に書き留めようとしています: a は Ints のリストです

d は int をキーとする dict です

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

モンスターリストが実際に各ターンで空になることがわかりましたが、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 に答える