2017-11-25 128 views
0

Python初学者问题在这里。我尝试在我正在创建的基于文本的游戏中使用pickle保存和加载对象,并且列表变量未按预期方式加载。这是我写来测试该问题的代码(在这个例子中)初始化之外初始化保存和载入OK(在这个例子中Y),但变量列表中pickle没有保存(或加载?)对象列表变量__init__

import pickle 

class my_class(object): 
    def __init__(self, x): 
     self.x = x 
     self.y = [1,2,3] 

    a = [4,5,6] 
    b = 8 

def save(object1): 
    print("Game saved") 
    pickle_out = open("saveobject1","wb") 
    pickle.dump(object1, pickle_out) 
    pickle_out.close() 

def load(): 
    print("Loading......") 
    pickle_in = open("saveobject1","rb") 
    object1 = pickle.load(pickle_in) 
    return object1 

object1 = my_class(10) 

print ("object1.x = " + str(object1.x)) 
print ("object1.y = " + str(object1.y)) 
print ("object1.a = " + str(object1.a)) 
print ("object1.b = " + str(object1.b)) 
print ("\n") 

answer = input("Would you like to save (s) or load (l)?: ") 

if answer == "s": 
    save(object1) 

object1.x = 20 
object1.y[2] = 6 
object1.a[2] = 12 
object1.b = 16 

if answer == "l": 
    object1 = load() 

print ("object1.x = " + str(object1.x)) 
print ("object1.y = " + str(object1.y)) 
print ("object1.a = " + str(object1.a)) 
print ("object1.b = " + str(object1.b)) 
print ("\n") 

表变量不。但是,init以外的非列表变量会保存并加载。预先感谢您的建议。

回答

0

__init__中的所有变量都是实例变量,因此将被保存。 __init__之外的列表和非列表变量都是类变量,因此不会被保存。

但是,当您更改object1.b创建实例变量b而不是设置类变量时,它将被保存。但是,修改object1.a时,不会重新分配它,只是它的一个元素,所以它仍然是一个(未保存的)类变量。

如果要保存它,请将其作为实例变量或单独保存类变量。

+0

非常感谢您的回答,现在更有意义。我想在游戏中保存的列表是世界地图,它是一个总共包含42个元素的列表列表,所以我想让它成为一个实例变量比单独保存更容易。除非有一种简单的方法来保存我不知道的清单? – Lang0n