代码之家  ›  专栏  ›  技术社区  ›  Gabbisen

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

  •  0
  • Gabbisen  · 技术社区  · 2 年前
    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()
    
    2 回复  |  直到 2 年前
        1
  •  2
  •   Samwise    2 年前

    下面是一个如何将游戏数据存储在dict中并使用 json 模块,以便轻松保存/加载。首先,我将把所有变量声明放入一个dict中(注意,我通常会使用 {} 语法,而不是 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,
    )
    

    现在我可以写你的 save load 每个函数仅包含几行代码:

    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 模块负责读取行、解析行、将行转换为正确的类型, 所有这些 ,因为它可以直接从dictionary对象中提取所需的所有信息。如果你有十几个不同的变量,你就无法获得同样的便利性和灵活性。

    为了建议如何将游戏代码的其他部分转换为使用dict而不是单个变量,我需要查看这些代码,但希望这一示例能够帮助您相信生活可以 如果您不需要一次处理一个变量,那么就更容易了!

        2
  •  -2
  •   Jacek Błocki    2 年前

    由于基本类型是按值传递的,所以它不会按您的期望工作。您可以尝试:

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

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