2017-11-25 3 views
0

Python 초보자 용 질문은 여기에 있습니다. 내가 만들고있는 텍스트 기반 게임에서 피클을 사용하여 개체를 저장하고로드하려고 시도하고 있으며 목록 변수가 예상대로로드되지 않습니다. (이 예에서) 초기화 외부 저장 및로드 OK (이 예에서는 y)에 있지만 목록에 변수를 초기화하기 피클이 오브젝트 목록 변수를 __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") 

목록 변수하지 : 이것은 내가 문제를 테스트하기 위해 작성한 코드입니다. 그러나 외부의 비 목록 변수는 저장하고로드합니다. 미리 조언 해 주셔서 감사합니다.

답변

0

__init__ 내의 모든 변수가 인스턴스 변수이므로 저장됩니다. __init__ 외부의 목록 및 비 목록 변수는 모두 클래스 변수이므로 저장되지 않습니다.

그러나 클래스 변수를 설정하는 대신 b 인스턴스 변수를 생성하는 object1.b을 변경하면이 변수가 저장됩니다. 그러나 object1.a을 수정하면 다시 할당하지 않고 그 요소 만 다시 할당하므로 아직 (저장되지 않은) 클래스 변수입니다.

저장하려면 인스턴스 변수로 만들거나 클래스 변수를 별도로 저장하십시오.

+0

답장을 보내 주셔서 감사합니다. 게임에 저장하고자하는 목록은 세계지도입니다. 총 42 개의 요소가있는 목록이므로 인스턴스 변수를 따로 저장하는 것보다 쉽습니다. 내가 모르는 그러한 목록을 저장하는 쉬운 방법이 없다면? – Lang0n

관련 문제