我目前正在尝试学习Python并学习了基础知识,我决定尝试制作一个地址簿程序。我在保存后加载联系人时遇到问题。这是我到目前为止所拥有的,
import pickle
contacts = {}
class Contact:
def __init__(self, name, phone, address):
self.name = name
self.phone = phone
self.address = address
Name = input('Contacts Name - ')
Phone = input('Phone Number - ')
Address = input('Address - ')
contacts[Name] = Contact(Name, Phone, Address)
with open('SaveFile', 'wb') as f:
pickle.dump(contacts, f)
这一切似乎工作正常并且保存了联系人字典,但是当我在清除字典后尝试加载联系人时,由于某种原因它不起作用,
def load():
with open('SaveFile', 'rb') as f:
contacts = pickle.load(f)
我没有收到错误消息,但字典保持空白。 任何有关这方面的帮助将非常感激!
答案 0 :(得分:1)
变量有范围。您在contacts
函数中分配的load
变量与您定义为全局变量的contacts
无关。最简单的解决方案是使您的函数return
成为新加载的联系人,让您替换现有的字典:
def load_contacts():
with open('SaveFile', 'rb') as f:
new_contacts = pickle.load(f)
return new_contacts
...
contacts = load_contacts()
如果您确实希望直接访问contacts
函数中的全局load
变量,可以使用global
关键字告诉Python您引用{来自全球范围的{1}}:
contacts
您还可以避免分配到全局def load():
global contacts
with open('SaveFile', 'rb') as f:
contacts = pickle.load(f)
,而是修改它:
contacts
最后一个示例的不同之处在于您直接使用def load():
contacts.clear()
with open('SaveFile', 'rb') as f:
new_contacts = pickle.load(f)
contacts.update(new_contacts)
引用的对象。
答案 1 :(得分:0)
尝试使用以下内容:
pickle.load(open("SaveFile", 'rb'))