尝试将全局变量添加到列表而不是分配中

时间:2019-07-11 10:47:03

标签: python-3.x

代码是更大程序的一部分。 Save函数保存全局数据(我知道您不应该使用全局变量),而Load函数应该加载它,并将全局变量更改为已加载的对象。我知道列表仅保存分配的对象,而不保存变量本身,但是我不知道如何才能做到这一点。 对于这种情况,有一种解决方案必须更改我保存var的方式,并且还要在代码中放入有效的Save函数。 感谢您的帮助。

我在互联网上搜索了一个解决方案,并尝试了一些模块,但无法正常工作。


#works
def Save():
    global a, b, c, d, e
    toSave = [a, b, c, d, e]
    count = 0
    f = open("file.txt", "w") #file where the vars get saved and should be loaded from
    for x in range(len(toSave)):
        save = toSave[count]
        f.write(str(save)+"\n") #writes the objects the vars are assigned to into a file which each objekt having it's own row
        count += 1
    tkinter.messagebox.showinfo("Save","Your progress got saved.")

def Load():
    global a, b, c, d, e
    toLoad = [a, b, c, d, e]
    count = 0
    f = open("file.txt", "r")
    for x in range(len(toLoad)):
        toLoad[count] = f.readline() #changes the numbers in the list. Should change the global vars
        count += 1
    tkinter.messagebox.showinfo("Load","Your progress got loaded.")

我只希望全局变量成为已保存的对象,所以我可以在程序中加载和保存保存文件(这是一个小游戏)。

2 个答案:

答案 0 :(得分:0)

您必须将数据显式分配给相关变量:

  1. 读取列表中的所有值,就像在代码中一样
  2. 解压缩列表:a, b, c, d, e = the_list

或使用一个可以保存数据的全局对象:

GameState = {
 "level": 1,
 "player": {
  "health": .9,
  "strength": .2
 }
}

然后在您的函数中修改该单个对象。

答案 1 :(得分:0)

将所有内容另存为JSON数据,然后将其作为字典重新带回,并使用它来加载全局变量。

import json
#works
def Save():
    global a, b, c, d, e
    save_dict = {
        'a': a,
        'b': b,
        'c': c,
        'd': d,
        'e': e
    }
    json_save_data = json.dumps(save_dict)
    with open('file.json' mode='w') as file:
        file.write(json_save_data)
    tkinter.messagebox.showinfo("Save","Your progress got saved.")

def Load():
    global a, b, c, d, e
    with open('file.json', "r") as file:
        data = file.readlines()
    global_dict = json.loads(data)
    a = global_dict['a']
    b = global_dict['b']
    c = global_dict['c']
    d = global_dict['d']
    e = global_dict['e']
    tkinter.messagebox.showinfo("Load","Your progress got loaded."