在Python中当列表更改时调用函数

在Python中当列表更改时调用函数,python,list,function,Python,List,Function,我只是想知道,当列表中添加了一个项目时,是否可以调用一个函数。 如果它看起来像这样的话: def listchanged(): print("The list has been changed!") list = ["apples","bananas"] listevent(list,listchanged) 在shell中,您将向列表添加一个项目,它将打印列表已更改 谢谢 更改列表时,可以将列表子类化以打印 def listchanged(): print("Th

我只是想知道,当列表中添加了一个项目时,是否可以调用一个函数。 如果它看起来像这样的话:

def listchanged():
    print("The list has been changed!")

list = ["apples","bananas"]
listevent(list,listchanged)
在shell中,您将向列表添加一个项目,它将打印列表已更改

谢谢

更改列表时,可以将列表子类化以打印

def listchanged():
    print("The list has been changed!")

lt = ["apples","bananas"]


def listevent(lt):
    prev_len=len(lt)

    lt.append("grapes")

    new_len=len(lt)
    
    if(prev_len!=new_len):
          listchanged()
listevent(lt)
下面是一个例子:

class EventList(list):

    def __setitem__(self, key, value):
        super(EventList, self).__setitem__(key, value)
        print("The list has been changed!")

    def __delitem__(self, value):
        super(EventList, self).__delitem__(value)
        print("The list has been changed!")

    def __add__(self, value):
        super(EventList, self).__add__(value)
        print("The list has been changed!")

    def __iadd__(self, value):
        super(EventList, self).__iadd__(value)
        print("The list has been changed!")

    def append(self, value):
        super(EventList, self).append(value)
        print("The list has been changed!")

    def remove(self, value):
        super(EventList, self).remove(value)

l = EventList(["apples","bananas"])
l.append('test')
印刷品:

The list has been changed!

只需比较以下列表:

old_list = ["apples","bananas"]
new_list = ["apples","bananas"]
newer_list = ["apples","bananas", "oranges"]

old_list == new_list #true
old_list == newer_list #false
如果列表在相同的标记中有相同的元素,而不是它们在lamens中的id或哈希完全相同,那么这将不使用as==比较的子类。只需将旧的保存在一个变量中,然后当您想要检查时,只需使用这个。注意:这不提供自动调用打印的方法。这只是另一种方法

在更改列表时,您可以将要打印的列表子类化

下面是一个例子:

class EventList(list):

    def __setitem__(self, key, value):
        super(EventList, self).__setitem__(key, value)
        print("The list has been changed!")

    def __delitem__(self, value):
        super(EventList, self).__delitem__(value)
        print("The list has been changed!")

    def __add__(self, value):
        super(EventList, self).__add__(value)
        print("The list has been changed!")

    def __iadd__(self, value):
        super(EventList, self).__iadd__(value)
        print("The list has been changed!")

    def append(self, value):
        super(EventList, self).append(value)
        print("The list has been changed!")

    def remove(self, value):
        super(EventList, self).remove(value)

l = EventList(["apples","bananas"])
l.append('test')
印刷品:

The list has been changed!

只需比较以下列表:

old_list = ["apples","bananas"]
new_list = ["apples","bananas"]
newer_list = ["apples","bananas", "oranges"]

old_list == new_list #true
old_list == newer_list #false

如果列表在相同的标记中有相同的元素,而不是它们在lamens中的id或哈希完全相同,那么这将不使用as==比较的子类。只需将旧的保存在一个变量中,然后当您想要检查时,只需使用这个。注意:这不提供自动调用打印的方法。这只是另一种方式

你到底需要这个做什么?也许有更好的办法。例如,您是想记录每次更改,还是只想知道列表是否在某个较早的时间点发生了更改?列表可能通过哪些方法进行更改?不是自动更改,不是。您必须自己进行此类更改,确保仅使用您创建的通知事件侦听器的函数来更改列表。您到底需要它做什么?也许有更好的办法。例如,您是想记录每次更改,还是只想知道列表是否在某个较早的时间点发生了更改?列表可能通过哪些方法更改?不是自动更改的,不是。你必须自己做这类事情,确保你只使用通知事件侦听器的函数更改列表。问题很模糊,可能是想让它更清楚。没有那么模糊,答案是否定的。他不想更改listevent中的列表,他想在列表作为事件侦听器更改时调用listevent。默认情况下Python中不存在。命名列表不是一个好主意,因为这是您在新定义下隐藏的类型的名称。问题很模糊,可能是想让它更清楚。不是那么模糊,答案只是不。他不想更改listevent中的列表,他希望在列表作为事件侦听器更改时调用listevent。默认情况下Python中不存在。命名列表不是一个好主意,因为这是您在新定义下面隐藏的类型的名称。