我一直在考虑将我的 Python 2.7 项目转换为 3。我发现我主要使用 .keys() 作为不必要的
for x in d:
具有相同的效果
for in in d.keys():
但是,我还了解到,在遍历字典时,您不应该对其进行变异。这还没有出现,因为我一直在使用 Python2.7 的 .keys() 来创建字典键的副本作为列表。Python 3 的 .keys() 版本创建的是视图而不是副本,因此不能用于相同目的。
2to3 将 d.keys() 转换为 list(d.items()) 但我并不严格需要列表中的键。我已经看到 d.copy().keys() 建议,但我不明白为什么 (Python 3) .keys() 位是必要的。
在 Python Docs 中它说
在迭代字典时修改键的值是安全的,但前提是键集不改变
那么“变异”是否仅指更改密钥呢?大多数情况下,我只在迭代时更改字典值,但我发现某个地方有可能删除当前键
所以基本上我需要用任何东西替换 .keys() ,如果是这样,最pythonic/高效的选项是什么?
具体代码(我在冒险游戏/互动小说引擎中重复效果/随时间推移造成的伤害的一部分)是这样的:
def Age(beats) :
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 :
del echoes[echo]
break
except TypeError : #Will be raised if reps is Infinite
pass
char['Echoes'] = echoes
char.write()
return actions
是的,我可能一个人在这里犯下各种风格指南的罪过。我是自学的,发现这个项目的所有好的实践都太晚了。对不起,如果我让你的眼睛流血了。
慕森卡
MMMHUHU
相关分类