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):
因為這將返回一個在迭代過程中不會改變大小的“新”列表。
添加回答
舉報
