KeyError:0使用python dict的python
所以我正试图用python重新创建一个spaceInvaders游戏。这里是我的外星人的存放地:KeyError:0使用python dict的python,python,Python,所以我正试图用python重新创建一个spaceInvaders游戏。这里是我的外星人的存放地: aliens = dict() 每增加一次游戏等级,就会增加一个新的外星生物,它的id是一把钥匙,他的位置和生命值(每个外星生物有2点生命值,在两次射击后死亡,每次造成一点伤害)是他的值,所以外星生物字典可以如下所示: aliens = { 0: [(100, 50), 2], 1: [(50, 200), 1], etc... } 现在,每次外星人死亡时,我都会将其健康设置为-1,并将其位置设
aliens = dict()
每增加一次游戏等级,就会增加一个新的外星生物,它的id是一把钥匙,他的位置和生命值(每个外星生物有2点生命值,在两次射击后死亡,每次造成一点伤害)是他的值,所以外星生物字典可以如下所示:
aliens = {
0: [(100, 50), 2],
1: [(50, 200), 1],
etc...
}
现在,每次外星人死亡时,我都会将其健康设置为-1
,并将其位置设置为(-100,-100)
,以将其排除在视野之外,现在,当我调用cleanAlien()时会出现问题
函数,该函数遍历alien数组,并弹出每个运行状况等于-1
或越界位置的alien,以下是该函数:
def cleanAliens():
global aliens
for i in range(len(aliens)):
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
aliens.pop(i);
i -= i
def Aliens():
global aliens
clean = list()
for i in aliens.keys():
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
clean.append(i)
cleanAliens(clean)
def cleanExistes():
全球外星人
对于范围内的i(len(外星人)):
如果(外星人[i][0]==(-100,-100)或外星人[i][1]<0):
外星人,流行音乐(一);
i-=i
但是,当我尝试运行时,我得到一个错误:
if(外星人[i][0]==(-100,-100)或外星人[i][1]<0):
关键错误:0
有什么想法吗
提前感谢。我不确定这一特定错误的原因,但似乎外星人的结构并不像预期的那样 但是,您可以遍历字典的键,而不是遍历字典的大小,如下所示:
for i in list(aliens.keys()):
if aliens[i][0] == (-100, -100) or aliens[i][1] < 0:
aliens.pop(i)
列表中i的(existes.keys()):
如果外星人[i][0]==(-100,-100)或外星人[i][1]<0:
外星人,流行音乐(一)
这样你就不会陷入这个关键的麻烦
列表(existes.keys())
返回字典中键的副本,因此您可以对其进行迭代,从字典中删除一个键后,只需继续下一个键即可
(顺便说一句,i-=i
行没有意义,因为i
将根据其迭代器在下一次迭代中设置,因此您不能实际更改其值)而不是:
for i in range(len(aliens)):
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
aliens.pop(i);
i -= i
更新:收到关于“相同错误”的评论后进行测试: 没有错误。编辑: 通过创建一个列表修复了我的错误,该列表附加了每个要删除的键,然后传递给此函数:
def cleanAliens():
global aliens
for i in range(len(aliens)):
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
aliens.pop(i);
i -= i
def Aliens():
global aliens
clean = list()
for i in aliens.keys():
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
clean.append(i)
cleanAliens(clean)
在循环的每次迭代中添加
打印(外星人)
,并确保循环中有一个key=0dict@Meccano这是引发错误之前的最后一个输出:{1:[(540,103),2],2:[(218,110),2]}
为什么在循环结束时执行i-=i
?为什么您选择以这种不典型的方式编写i=0
?@Daweo我这样做是因为当我弹出一个元素时,字典的长度会缩短,但是,即使没有i-=1
它也会给我带来相同的错误。请回答您的问题并提供答案。感谢您的回答,但这在我的情况下不起作用,并会引发相同的错误谢谢您的有用回答,给我带来了其他错误,但是我现在得到了:for i in alien.keys():RuntimeError:dictionary在迭代期间在代码中的同一位置更改了大小
?我已经在一个虚拟字典上测试了这个方法,它似乎是有效的。
def cleanAliens(cleanList):
global aliens
for i in range(len(cleanList)):
aliens.pop(cleanList[i]);