2 回答
TA贡献1806条经验 获得超8个赞
我建议创建一个需要删除的键列表,然后在完成循环后删除它们:
def Age(beats):
to_remove = []
actions = []
for echo in echoes.keys():
echoes[echo]['elapsed'] += beats
activations = echoes[echo]['elapsed']/echoes[echo]['interval']
while activations >= 1 :
actions.append(str(echoes[echo]['action']))
echoes[echo]['elapsed'] -= echoes[echo]['interval']
activations = echoes[echo]['elapsed']/echoes[echo]['interval']
try :
echoes[echo]['reps'] -= 1
if echoes[echo]['reps'] < 1 :
to_remove.append(echo)
break
except TypeError : #Will be raised if reps is Infinite
pass
for echo in to_remove:
del echoes[echo]
char['Echoes'] = echoes
char.write()
return actions
我也认为它的可读性稍微好一些.items():
for echo, value in echoes.items():
value['elapsed'] += beats
...
TA贡献1834条经验 获得超8个赞
我已经看到 d.copy().keys() 建议,但我不明白为什么 (Python 3) .keys() 位是必要的。
你读得还不够仔细。由于d.copy().keys()
创建了字典的副本然后从该副本创建键,因此它本质上指向字典和键的新“视图”。
这基本上是它在 python 2.7 中所做的,因此它可以用于您的目的。
因此,在 python 2.7 中,直接从 dict 创建一个新列表并返回,而 python 3 直接指向该 dict 的键,这意味着如果它在迭代过程中发生变化,它将抛出并出错。
您可以在 python 3 中解决此问题的另一种方法是:
for x in list(d):
因为这将返回一个在迭代过程中不会改变大小的“新”列表。
添加回答
举报