首页 > 解决方案 > 将人员对象添加到另一个对象,除非它们相同

问题描述

我正在尝试使用 Python 的类。我创建了一个 Person() ,它只定义了一个带有“兄弟”属性的人。现在,我要做的是实例化一个 Person 并将所有其他 Person 对象添加到他的“兄弟”属性中。现在我的问题是,即使我添加了检查以确保我不会将对象自己添加到兄弟属性中,它也会发生。这是我的代码:

class Person():
    def __init__(self, name, bros=[]):
        self.name = name
        self.bros = bros

    def has_bros(self):
        if len(self.bros) >0 :
            return True
        return False

    def get_name(self):
        return self.name

    def add_bro(self, bro):
        if not bro.get_name() in [b.get_name() for b in self.bros] and bro.get_name() != self.name:
            self.bros.append(bro)
        print(f"param {self.name} has bros: {[brow.get_name() for brow in self.bros]}")

    def get_bros(self):
        return self.bros

people = ["Martin", "Charles", "Miriam", "Etienne"]

final_list = list()

for person in people:
    current_guy = Person(person)
    for existing_person in final_list:
        existing_person.add_bro(current_guy)
        current_guy.add_bro(existing_person)
    final_list.append(current_guy)

print("List of Persons with bros:")
for p in final_list:
    print(f"Person name: {p.get_name()}, his bros :{[bro.get_name() for bro in p.get_bros()]}")

我做错了什么,但我找不到什么^^'有人可以向我解释为什么这不起作用吗?

谢谢各位!

标签: python-3.x

解决方案


将您的__init__方法替换为:

def __init__(self, name, bros=None):
    self.name = name
    self.bros = bros or []

否则,只要您在Person没有明确给出bros. 一个更简单的示例来演示发生了什么:

def test(default=[]):
    default.append(1)
    print(default)

调用了三遍:

>>> test()
[1]
>>> test()
[1, 1]
>>> test()
[1, 1, 1]

推荐阅读