discord.py命令调用时如何保留数值修改实现预期递减输出
问题原因
每次执行命令都输出7,是因为money1定义在命令函数内部,属于局部变量。每次触发命令时函数会从头运行,直接把money1重置为初始值10,减3后得到7,上一次执行的修改结果根本不会被保存。
解决方法
要让数值修改跨多次命令调用保留,需要把存储数值的变量放到不会随函数执行重置的作用域,或者用持久化存储,两种常用实现如下:
全局变量方案:适合临时测试
把要留存的变量定义在命令函数外的全局作用域,函数内修改时提前声明使用全局变量即可,代码示例:# 全局作用域定义,不会随每次命令执行重置 money1 = 10 bint = 3 @client.command() async def test(ctx): # 声明使用全局变量,否则函数内赋值会新建局部变量 global money1 if money1 >= 3: money1 = money1 - bint await ctx.send(money1)这个版本执行时第一次输出7、第二次4、第三次1,完全符合预期。
注意:全局变量存储的数值会在机器人重启后恢复初始值10,只适合临时测试用。
持久化存储方案:适合正式运行场景
如果需要机器人重启后数值也不丢失,要把数值存在文件、数据库这类可以永久保存的介质里,举个最简单的JSON文件存储实现:- 先在脚本同目录新建
data.json文件,写入初始内容{"money1": 10} - 命令逻辑调整为每次执行先读文件取存储值,修改后再把新值写回文件,代码示例:
import json import os bint = 3 DATA_FILE = "./data.json" @client.command() async def test(ctx): # 读取已存储的数值 if os.path.exists(DATA_FILE): with open(DATA_FILE, "r", encoding="utf-8") as f: save_data = json.load(f) else: save_data = {"money1": 10} if save_data["money1"] >= 3: save_data["money1"] -= bint # 把修改后的数值写回文件永久保存 with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(save_data, f) await ctx.send(save_data["money1"])- 先在脚本同目录新建
内容的提问来源于stack exchange,提问作者rusyator
相关产品推荐
相关产品推荐

