You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何永久修改Python其他文件中存储的变量值?

永久修改Python RPG游戏中的玩家状态变量

问题场景

我正在开发一款纯Python文本类RPG游戏,文件结构如下:

Parent Folder
    abc/
        A.py
    xyz/
        B.py

A.py中定义了玩家背包变量:

userInventory = ["hp_potion", "pod_token", "broken_cup"]

我尝试在B.py中导入A.py并修改该列表:

import sys
sys.path.insert(0, '../abc')
import A

A.userInventory.append("bronze_sword")

但修改仅在程序运行时临时生效,重启后A.py中的变量会恢复原值——因为Python只是在内存中修改变量,并未改动文件本身的内容。需要实现永久修改该变量,让其他文件后续调用时能读取到更新后的值。

解决方案

方法1:使用JSON文件持久化(推荐)

将玩家状态从代码文件中分离,用JSON文件存储,修改后直接写入文件即可永久保存,且JSON文件可读、跨语言,适合大多数场景。

  1. 在abc/目录下创建player_data.json,初始内容:
{"userInventory": ["hp_potion", "pod_token", "broken_cup"]}
  1. 修改A.py为数据管理模块,负责读写JSON:
import json
import os

# 确定数据文件的绝对路径,避免路径问题
DATA_PATH = os.path.join(os.path.dirname(__file__), "player_data.json")

def load_inventory():
    """加载当前玩家背包"""
    with open(DATA_PATH, "r", encoding="utf-8") as f:
        data = json.load(f)
        return data.get("userInventory", [])

def save_inventory(inventory):
    """将修改后的背包保存到文件"""
    data = {"userInventory": inventory}
    with open(DATA_PATH, "w", encoding="utf-8") as f:
        json.dump(data, f, indent=4)
  1. 在B.py中调用模块完成修改:
import sys
sys.path.insert(0, '../abc')
import A

# 加载当前背包
inventory = A.load_inventory()
# 追加物品
inventory.append("bronze_sword")
# 永久保存修改
A.save_inventory(inventory)

后续任何文件调用load_inventory()都会获取到最新的背包数据。

方法2:使用Pickle序列化(适合复杂Python对象)

如果玩家状态包含Python特有的自定义类实例,可使用Pickle进行二进制序列化存储:

  1. 修改A.py为:
import pickle
import os

DATA_PATH = os.path.join(os.path.dirname(__file__), "player_data.pkl")

def load_inventory():
    """加载背包,文件不存在则返回初始值"""
    if not os.path.exists(DATA_PATH):
        return ["hp_potion", "pod_token", "broken_cup"]
    with open(DATA_PATH, "rb") as f:
        return pickle.load(f)

def save_inventory(inventory):
    """保存背包到二进制文件"""
    with open(DATA_PATH, "wb") as f:
        pickle.dump(inventory, f)
  1. B.py中的调用逻辑和JSON方法一致:
import sys
sys.path.insert(0, '../abc')
import A

inventory = A.load_inventory()
inventory.append("bronze_sword")
A.save_inventory(inventory)

注意:Pickle文件为二进制格式,不可直接阅读,且仅支持Python解析。

不推荐:直接修改.py文件

虽然可以通过读写A.py文件来修改变量,但这种方法容易破坏代码语法、引发错误,仅适合临时测试,不建议用于正式项目:

# 仅作演示,请勿在项目中使用
import os

FILE_A_PATH = "../abc/A.py"

# 读取文件内容
with open(FILE_A_PATH, "r", encoding="utf-8") as f:
    lines = f.readlines()

# 定位并修改userInventory行
for idx, line in enumerate(lines):
    stripped_line = line.strip()
    if stripped_line.startswith("userInventory ="):
        # 解析原有列表并追加元素
        old_inventory = eval(stripped_line.split("=", 1)[1].strip())
        old_inventory.append("bronze_sword")
        lines[idx] = f'userInventory = {old_inventory}\n'
        break

# 写回文件
with open(FILE_A_PATH, "w", encoding="utf-8") as f:
    f.writelines(lines)

总结

对于RPG游戏的玩家状态管理,优先选择JSON或Pickle这类持久化存储方案,实现数据与代码分离,既安全又便于维护。直接修改代码文件的方式风险较高,不推荐用于正式开发。

内容的提问来源于stack exchange,提问作者Snehil Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:54:14