编辑列表中的变量(不能使用字典)

Edit a variable from list (Cannot use dictionary)

a = 10
b = 20
ls = [a, b]

如何将变量 a 更改为例如20 使用 ls[0] 作为参数?

我记得有一些方法可以编写代码,您可以在其中输入字符串和变量,它会变成一行代码 运行 它。

我依稀记得是这样的,大概是这样的:

run(ls[0], "= 20")

显示整个代码,而不是压缩版本,我想做的是从文本文件加载和保存变量。 (代码是关于制作毒品的终端游戏。)

money = 11000

growtime = 45
growreward = 50
gramsweed = 0
growing = False

pots = 1
seeds = 0

cooktime = 90
cookreward = 20
gramsmeth = 0
cooking = False

tanks = 0
methlitres = 0

weedselling = 0
methselling = 0
currentlyselling = False

dealers = 1
dealtime = 120
dealamount = 15

stats = [money, growtime, growreward, gramsweed, growing, pots, seeds, cooktime,
         cookreward, gramsmeth, cooking, tanks, methlitres, weedselling, methselling,
         currentlyselling, dealers, dealtime, dealamount]

boolstats = [growing, cooking, currentlyselling]

def save():
    f = open("save.txt", "w")
    for stat in stats:
        f.write(str(stat) + "\n")
    f.close()
    mainmenu()

def load():
    i = 0
    f = open("save.txt", "r")
    for stat in stats:
        print(stat)
        stats[i] = f.readline(i)
        i += 1
    j = 0
    for stat in boolstats:
        if stat == "False": boolstats[j] = False
        else: boolstats[j] = True
        j += 1
    f.close()
    mainmenu()

它不会像您希望的那样工作,因为原始类型是按值传递的。你可以试试:

globals()['a'] = 20 # works for global variables only, not local

或将您的值存储在 class 变量中,然后它的列表将保留对它的引用。

这是一个示例,说明如何将游戏数据存储在字典中并使用 json 模块轻松地 save/load 它。我将首先将您所有的变量声明放入一个字典中(请注意,我通常会使用 {} 语法而不是 dict() 构造函数,但我正在复制并粘贴您现有的代码,这使它稍微容易一些):

stats = dict(
    money = 11000,

    growtime = 45,
    growreward = 50,
    gramsweed = 0,
    growing = False,

    pots = 1,
    seeds = 0,

    cooktime = 90,
    cookreward = 20,
    gramsmeth = 0,
    cooking = False,

    tanks = 0,
    methlitres = 0,

    weedselling = 0,
    methselling = 0,
    currentlyselling = False,

    dealers = 1,
    dealtime = 120,
    dealamount = 15,
)

现在我可以用几行代码编写您的 saveload 函数:

import json

def save():
    with open("save.txt", "w") as f:
        json.dump(stats, f)

def load():
    with open("save.txt") as f:
        stats.update(json.load(f))

json 模块负责读取行,解析它们,将它们转换为正确的类型,全部,因为它可以拉取所有它需要的信息直接来自字典对象。如果您有十几个不同的单独变量,您将无法获得同样类型的便利性和灵活性。

为了建议您将游戏代码的其他部分转换为使用 dict 而不是单个变量的方法,我需要查看该代码,但希望这个示例有助于让您相信生活可以 如果您不需要一次处理一个变量,那么会容易得多!