<p>你的问题是你对变量和任务如何工作的理解。在下面的代码中,您创建了许多列表。然后创建一个名为NPCatt的变量,该变量引用您创建的所有这些列表</p>
<pre class="lang-py prettyprint-override"><code>#Attributes
name=[] ; occupation=[];weakness=[];need=[];desire=[];enemy=[];rumor=[];secret=[];passion=[]
redeemdamningquality=[];happy=[];occdesire=[];occcomplication=[];pcopinion=[];accomplish=[]
magical=[];politinfl=[];resource=[];intel=[];research=[]
NPCatt=[name,occupation,weakness,need,desire,enemy,rumor,secret,passion,redeemdamningquality,happy,occdesire,occcomplication,pcopinion, accomplish,magical,politinfl,resource,intel,research]
</code></pre>
<p>因此,如果我看NPCatt[0],它将是一个所有npc名称的列表。这很好。然而,你继续做下去</p>
<pre class="lang-py prettyprint-override"><code>with open(newfile, 'rb') as fi:
NPCatt = pickle.load(fi)
</code></pre>
<p>现在变量NPCatt并不指向所有列表。它现在指向未勾选的对象。因此,当您稍后执行names.append时,它将更新名称列表,但NPCatt不再指向此列表。因此,当你腌制NPCatt时,只需腌制你从文件中加载的内容</p>
<p>这是你错误的症结所在。如果您想在取消勾选后修改NPCatt保存的数据,那么您应该像这样访问它</p>
<pre><code> if a!="":
NPCatt[0].insert(raw+1,a);print ("Name Inserted Successfully")
else:
print ("Skipped!")
print ("Enter Occupation of NPC" + str(raw) ) ;a=input()
if a!="":
NPCatt[1].insert(raw+1,a);print("Occupation Inserted Successfully")
else:
print ("Skipped!")
</code></pre>
<p>然而,这变得非常混乱,不清楚哪个列表正在更新,因为您必须按索引位置引用它。您最好在这里查看python字典,因为您可以通过名称而不是索引位置来引用内容。或者,如果你准备创建一个NPC类,然后通过NPC\u ID:NPC\u class\u实例将每个NPC存储在dict中,那就更好了</p>
<p><strong>更新</strong></p>
<p>下面是一个简单的例子,我用一个npc类和一个dict按id存储npc。这只是一个简单的例子,没有任何关于设计或pro和con的真实想法,只是为了给大家展示一个例子</p>
<pre class="lang-py prettyprint-override"><code># import pickle
import pickle
npcs_pickle_file = 'NPCatt.pk'
npc_count = 170
class NPC:
def __init__(self, name="", occupation="", weakness="", need="", desire="", enemy="",
rumor="", secret="", passion="", redeem_damning_quality="", happy="",
occ_desire="", occ_complication="", pc_opinion="", accomplish="", magical="",
politinfl="", resource="", intel="", research=""):
# Attributes
self.name = name
self.occupation = occupation
self.weakness = weakness
self.need = need
self.desire = desire
self.enemy = enemy
self.rumor = rumor
self.secret = secret
self.passion = passion
self.redeem_damning_quality = redeem_damning_quality
self.happy = happy
self.occ_desire = occ_desire
self.occ_complication = occ_complication
self.pc_opinion = pc_opinion
self.accomplish = accomplish
self.magical = magical
self.politinfl = politinfl
self.resource = resource
self.intel = intel
self.research = research
def __str__(self):
npc_output = "####NPC SUMMARY####\n"
for att, val in self.__dict__.items():
if val:
npc_output += (f"{att} = {val}\n")
return npc_output
# open a pickle file
# load your data back to memory when you need it
try:
with open(npcs_pickle_file, 'rb') as fi:
npcs = pickle.load(fi)
except FileNotFoundError as fne:
#file doesnt exist prob first time running so create a dict with the 170 npc id's
npcs = {id: None for id in range(npc_count)}
#select an NPC to modify / create
npc_id = None
while not npc_id:
try:
npc_id = int(input(f"Enter the id number of the NPC you wish to modify: "))
except ValueError as ve:
print("You must provide a numerical id")
if npc_id < 0 or npc_id >= npc_count:
npc_id = None
print(f"you must provide a value between 0 and {npc_count}")
name = input("Enter name of NPC: ")
occupation = input("Enter NPC occupation: ")
if npcs[npc_id]:
npc = npcs[npc_id]
print(npc)
modify = input("This NPC already exists do you want to continue and change them? (y/n): ")
if modify.lower() == "y":
npc.name = name
npc.occupation = occupation
else:
npcs[npc_id] = NPC(name=name, occupation=occupation)
print(npcs[npc_id])
with open(npcs_pickle_file, 'wb') as fi:
# dump your data into the file
pickle.dump(npcs, fi)
</code></pre>