Skip to main content
 首页 » 编程设计

Python:在创建新对象之前检查对象是否已经存在

2025年05月04日15开发

请帮我看看下面缺少什么。我首先创建了我类(class)的三个对象并将它们添加到集合列表中。在创建任何其他对象之前,我想检查 以确保列表中不存在该人。如果此人已经存在,则不应再次创建此人。我希望通过执行 if prompt_fname == person.fname 和 prompt_lname == person.lname: 来实现此检查。显然,我做的不正确,因为程序仍然运行并创建了列表中已经存在的同一个人。它创造了这个人两次。我该如何修改才能捕捉到这一点,以便不再创建列表中已经存在的人。此外,不应在循环的每次迭代中一次又一次地创建任何新人。我是编程新手,所以请不要在您的回答中遗漏太多细节。非常感谢。

class Person(object): 
 
    personslist = [] 
    '''Creates a person object''' 
    def __init__(self, firstname, lastname): 
        self.lname = lastname.title() 
        self.fname = firstname.title() 
        Person.personslist.append(self) 
 
    def __str__(self): 
        return "{0} {1}".format(self.fname, self.lname) 
 
    def __repr__(self): 
        return "{0} {1}".format(self.fname, self.lname) 
 
 
Person("Adamu", "Emeka") 
Person("Femi", "Ojukwu") 
Person("Wole", "Jonathan") 
 
 
prompt_fname = "Adamu" 
prompt_lname = "Emeka" 
 
print(Person.personslist) 
 
for person in Person.personslist: 
    if prompt_fname == person.fname and prompt_lname == person.lname: 
        pass 
    else: 
        Person(prompt_fname, prompt_lname) 
 
print(Person.personslist) 

产量

[Adamu Emeka, Femi Ojukwu, Wole Jonathan] 
[Adamu Emeka, Femi Ojukwu, Wole Jonathan, Adamu Emeka, Adamu Emeka] 

使用 Python 3.4.1

请您参考如下方法:

您的循环正在检查每个条目,如果该特定条目不相等,它会创建另一个实例。但是,如果那个特定的条目是相等的,它不会停止,它只是继续到下一个不相等的项目。这就是为什么您实际上在最后得到了 两个 额外条目。

您可以通过保留标志来解决此问题:

found = False 
for person in Person.personslist: 
    if prompt_fname == person.fname and prompt_lname == person.lname: 
        found = True 
        break 
if not found: 
    Person(prompt_fname, prompt_lname) 

但是,有一种更好的方法可以做到这一点:您的方法效率很低,因为它每次都需要线性扫描。相反,保留一个以全名作为键的对象字典:

class Person(object): 
 
    persons_dict = {} 
    '''Creates a person object''' 
    def __init__(self, firstname, lastname): 
        self.lname = lastname.title() 
        self.fname = firstname.title() 
        fullname = "%s %s" % (self.fname, self.lname) 
        Person.persons_dict[fullname] = self 

现在您可以简单地一次性检查:

if "%s %s" % (prompt_fname, prompt_lname) not in Person.persons_dict: