【问题标题】:Calling functions when a list changes in PythonPython中列表更改时调用函数
【发布时间】:2020-01-24 14:26:18
【问题描述】:

我只是想知道您是否可以在更改列表(添加到其中的项目)时调用函数。 如果有的话,它看起来像这样:

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

list = ["apples","bananas"]
listevent(list,listchanged)

在 shell 中,您可以将一个项目附加到列表中,它会打印“列表已更改!”

谢谢!

【问题讨论】:

  • 你到底需要这个做什么?可能有更好的方法。例如,您是要记录每个更改,还是只是想知道列表是否从某个较早的时间点发生了更改?列表可能会被哪些方法改变?
  • 不是自动的,不是。你必须自己做这种事情,确保你只使用你创建的通知事件监听器的函数来更改列表。

标签: python list function


【解决方案1】:

您可以继承list 以在更改列表时打印。

这是一个例子:

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

这将在没有子类的情况下工作,因为== 比较列表是否在相同的索引中具有相同的元素,而不是如果它们在 id 或 hash 上完全相同(在 lamen 中)。只需将旧的保存在变量中,然后当您要检查时就使用它。 (注意:这并没有提供自动调用 print 的方法。它只是另一种方法

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

    • 问题比较模糊,可以试着说清楚。
    • 不是那么模糊,答案只是“不”。他不想更改 listevent 中的列表,他希望在列表更改时调用 listevent(作为事件侦听器)。默认情况下在 Python 中不存在。
    • 将列表命名为 list 不是一个好主意,因为这是您埋在新定义之下的类型的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多