我在使用delContact方法时遇到了麻烦,因为我想删除类似于delVar的对象,但是我不知道如何尝试过all = None或del all。但是当我在delContact()之后调用show方法/函数时,我想要删除的值仍然显示
class Phonebook:
def __init__(self,name,type,email,phone):
self.name = name
self.type = type
self.email = email
self.phone = phone
print('Adding {} as a Contact with an email of {} and a phone number of {}'.format(self.name,self.email,self.phone))
def tell(self):
print('Name: {} | Type: {} | Email: {} | Phone: {}'.format(self.name,self.type,self.email,self.phone))
def retName(self):
return self.name
All = []
def addContact():
name = input('Enter your the name please: ')
type = input('Enter the type of the Contact Please: ')
email = input('Enter the the email of the Contact Please: ')
phone = input('Enter the Phone number of the Contact Please: ')
merge = Phonebook(name,type,email,phone)
All.append(merge)
def show():
for all in All:
all.tell()
def delContact():
show()
delVar = input('Enter the name you want to delete: ')
for all in All:
if all.retName() == delVar:
print(all.retName())
all = ''
else:
continue
addContact()
addContact()
show()
delContact()
show()
答案 0 :(得分:2)
这里:
for all in All:
if all.retName() == delVar:
print(all.retName())
all = ''
您没有删除任何内容,只是将本地名称all
重新绑定到空字符串。要从列表中删除项目,您必须使用All.remove(item)
:
for all in All:
if all.retName() == delVar:
All.remove(all)
break
请注意,如果您有多个同名物品,则只会删除第一个...
还请注意,修改要迭代的列表可能会导致意外结果。在这种情况下是安全的,因为我们立即退出循环,但这通常是要避免的事情。
另一种更安全并会删除所有匹配项的解决方案是过滤列表,并用结果替换原始列表:
All[:] = [item for item in All if item.name != delVar]
哦,是的,您的retName
方法完全没有用,name
是您的类的公共属性。