python运行时如何调试_调试Python3运行时E

错误消息的意思和它说的一样:你在迭代字典的时候改变了它的大小。在

这种情况是这样的:self.enemydict[(goingTo[0], goingTo[1])] = self.enemydict[key]

这将向self.enemydict添加一个新值,它位于循环中,您可以在该字典上进行迭代:

^{pr2}$

下面是Python控制台中的一个简化示例:>>> d = { 'a': 'A', 'b': 'B' }

>>> d

{'a': 'A', 'b': 'B'}

>>> keys = d.keys()

>>> for k in keys:

... print( k )

... if k == 'a':

... d['c'] = 'C'

...

a

Traceback (most recent call last):

File "", line 1, in

RuntimeError: dictionary changed size during iteration

注意,即使我们已经将d.keys()分配到它自己的变量keys,Python仍然知道{}与原始字典相关联,因此当我们向d添加新元素时,它会使迭代无效。在

解决这个问题的一个简单方法是使用list()将keys()转换为一个简单的列表。然后,您将迭代该列表而不是原始字典,修改字典不会使迭代无效。(当然,迭代不会涉及您在本例中添加的新元素。)下面是一个示例:>>> d = { 'a': 'A', 'b': 'B' }

>>> for k in list(d.keys()):

... print( k )

... if k == 'a':

... d['c'] = 'C'

...

a

b

>>> d

{'a': 'A', 'b': 'B', 'c': 'C'}

下面是它在代码中的外观。我还将向您展示一个使代码更简单、更易于阅读的技巧。不要反复引用self.enemydict[key],而是将其保存在一个名为enemy的变量中,然后使用它。在

所以循环的第一部分是这样的:keys = self.enemydict.keys()

for key in keys:

leap = self.enemydict[key].leap

if self.enemydict[key].attacked == False:

self.enemydict[key].counter -= 1

if self.enemydict[key].counter <= 0 and self.enemydict[key].attacked == False:

self.enemydict[key].counter = self.enemydict[key].turncount

应该是这样的:for key in list(self.enemydict.keys()):

enemy = self.enemydict[key]

leap = enemy.leap

if enemy.attacked == False:

enemy.counter -= 1

if enemy.counter <= 0 and enemy.attacked == False:

enemy.counter = enemy.turncount

在后面的循环中,您可以从以下位置进行类似的更改:self.enemydict[(goingTo[0], goingTo[1])] = self.enemydict[key]

self.enemydict[key] = ' '

收件人:self.enemydict[(goingTo[0], goingTo[1])] = enemy

self.enemydict[key] = ' '

但请注意,我只更改了这两行中的第一行。我没有把第二行改成:enemy = ' '

这和原来的代码不一样。它不更新或添加self.enemydict中的值,而是更改enemy变量,因此它不再是对self.enemydict[key]的引用。在

当你做以下事情时,这不是问题:enemy.counter = enemy.turncount

因为我们没有改变enemy变量本身,只有.counter属性。enemy继续引用字典条目。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值