尝试在Python中向列表添加项目,但它的行为很奇怪。

3

我有一些事件,人们可以属于一个事件。因此我有一个事件类,看起来像这样:

class Event():
    name = ""
    people = []

我还有一个全局变量来保存所有的事件。
events   = []

现在我正在尝试将原始数据处理成事件和参与者:

    # If there are missions, add the events
    for m in wiki.missions:
        foundEvent = False
        for e in events:
            if e.name == m:
                foundEvent = True
                foundPerson = False
                for p in e.people:
                    if p.rawName == person.rawName:
                        foundPerson = True
                if not foundPerson:
                    e.people.append(person)
                    print "Added " + person.display + " to " + m + " (" + str(len(e.people)) + ")"

        if foundEvent == False:
            event = Event()
            event.name = m
            event.people.append(person)
            print "New " + person.display + " to " + m + " (" + str(len(event.people)) + ")"
            events.append(event)
            event = None

根据我的打印语句,我可以看到谁被添加到现有的事件中以及何时和谁创建了新事件。奇怪的是,每个事件中的人数总是增加所有事件中的人数。

New Joseph M. Acaba to STS-119 (1)
New Joseph M. Acaba to Soyuz TMA-04M (2)
New Joseph M. Acaba to Expedition 31 Expedition 32 (3)
Added Dominic A. Antonelli to STS-119 (4)
New Dominic A. Antonelli to STS-132 (5)
Added Richard R. Arnold to STS-119 (6)

这对我来说毫无意义,那么我做错了什么呢?(我确定有很多错误)

你的问题对我来说不是很清楚。你能展示一下期望的输出结果吗?你想要做什么? - Rohit Jain
2个回答

3

你应该使用实例变量而不是类变量。因此,设置你的类如下,并修改其余代码以适应它:

class Event:
    def __init__(self, name):
        self.name = name
        self.people = []

这里的重要区别正如您所描述的那样:实例变量设置为类的特定实例,而类变量则设置为该类的所有实例。


我不得不想...我的任何一个类都是如何工作的呢 :-/ 我想只是纯属运气 :) - Justin808
1
当你赋值例如 event.name = m 时,你创建了一个新的实例变量,它会遮盖类变量。而 event.people.append() 则是另一种情况:它会改变类变量。 - Janne Karila

1

你正在创建类变量,而不是实例变量,因此你将人员添加到类中,而不是每个新对象你正在创建。

尝试使用以下方法:

class Event():
    def __init__(self, name):
        self.name = ""
        self.people = []

以后

event = Event(m)
event.people.append(person)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接