我正在为我的经济创建审计日志。在这一点上,我让它在有人使用经济命令时向频道发送消息。
async def audit_log(ctx, bot, action, stats=None, new_bank=None, new_money=None):
audit_channel = bot.get_channel(813610020943953920)
old_stats = stats
new_stats = stats
if new_bank is not None:
new_stats['bank'] = new_bank
if new_money is not None:
new_stats['money'] = new_money
await audit_channel.send(f'{ctx.author} did {action},\nprev-bank: {old_stats["bank"]}, prev-cash: {old_stats["money"]}\nnew-bank: {new_stats["bank"]}, new-cash: {new_stats["money"]}')
Stats 是分配给数据库中某人文档的字典。其中两个值是货币和银行。不是每个命令都会更新银行和货币,如果命令更新它通过它。现在我已经描述了代码,我将描述问题。当我收到不和谐的消息时,它的新旧都等于新。当我做一些打印时,我最终发现它改变了 if 语句中的 old_stats。它改变了货币中的货币和银行中的银行。
我花了大约 5 个小时试图解决这个问题,我们将不胜感激。
答案 0 :(得分:2)
这里的错误是您将 old_stats
和 new_stats
都分配给 stats,并且由于字典是可变的,python 使 old_stats
和 new_stats
保持相同的字典,所以如果你更新一个,你就会更新“两者”。要解决此问题,您可以使用复制模块复制功能:copy.copy(stats)
。
这就是你的代码看起来固定的样子:
# imports
import copy
# ... other code
async def audit_log(ctx, bot, action, stats=None, new_bank=None, new_money=None):
audit_channel = bot.get_channel(813610020943953920)
old_stats = copy.copy(stats)
new_stats = copy.copy(stats)
if new_bank is not None:
new_stats['bank'] = new_bank
if new_money is not None:
new_stats['money'] = new_money
await audit_channel.send(f'{ctx.author} did {action},\nprev-bank: {old_stats["bank"]}, prev-cash: {old_stats["money"]}\nnew-bank: {new_stats["bank"]}, new-cash: {new_stats["money"]}')
new_stats
分配给 stats
的副本并将 old_stats
分配给 stats
的副本。