pickle不保存(或加载?)对象列表变量__init__之外

时间:2017-11-25 21:59:16

标签: python list pickle

Python初学者问题。我试图在基于文本的游戏中使用pickle保存和加载对象,并且列表变量未按预期加载。这是我为测试问题而编写的代码:

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 中的变量保存并加载OK(在此示例中为y)但 init 之外的列表变量不会(在此示例中为a)。但是, init 之外的非列表变量会进行保存和加载。提前感谢您的建议。

1 个答案:

答案 0 :(得分:0)

object1.b中的所有变量都是实例变量,因此将被保存。 <{1}}之外的列表变量和非列表变量都是类变量,因此不会保存。

但是,当您更改b创建实例变量object1.a而不是设置类变量时,它将被保存。但是,当您修改toolbar.add(radioButtonDDA, BorderLayout.NORTH); toolbar.add(radioButtonPolygon, BorderLayout.NORTH); toolbar.add(new JSeparator(1)); toolbar.add(radioButtonseedFill, BorderLayout.NORTH); toolbar.add(radioButtonScanLine, BorderLayout.NORTH); toolbar.add(patternCheckBox, BorderLayout.NORTH); toolbar.add(buttonClear, BorderLayout.NORTH); 时,您不会重新分配它,只是它的一个元素,因此它仍然是一个(未保存的)类变量。

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

相关问题