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

pickle not saving (or loading?) object list variable outside __init__

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 内列出变量保存和加载正常(在本例中为 y)但在 init 外列出变量不(在本例中为 a)例子)。但是,init 之外的非列表变量会保存和加载。在此先感谢您的建议。

__init__内的所有变量都是实例变量,所以会被保存。 __init__之外的列表变量和非列表变量都是class变量,所以不会被保存。

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

如果要保存,将其设为实例变量或单独保存class个变量。